This commit is contained in:
45
help/三主宠查询.sql
Normal file
45
help/三主宠查询.sql
Normal file
@@ -0,0 +1,45 @@
|
||||
-- 删除:每个多余精灵组中除了最早创建的其余记录
|
||||
WITH pet_group_mapping AS (
|
||||
SELECT
|
||||
id,
|
||||
player_id,
|
||||
-- 核心修正:PARTITION BY中直接写分组逻辑
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY
|
||||
player_id,
|
||||
CASE -- 3个一组的分组逻辑
|
||||
WHEN (data->>'ID')::INT BETWEEN 1 AND 3 THEN 'group_1_3'
|
||||
WHEN (data->>'ID')::INT BETWEEN 4 AND 6 THEN 'group_4_6'
|
||||
WHEN (data->>'ID')::INT BETWEEN 7 AND 9 THEN 'group_7_9'
|
||||
WHEN (data->>'ID')::INT BETWEEN 301 AND 303 THEN 'group_301_303'
|
||||
WHEN (data->>'ID')::INT BETWEEN 304 AND 306 THEN 'group_304_306'
|
||||
WHEN (data->>'ID')::INT BETWEEN 307 AND 309 THEN 'group_307_309'
|
||||
END
|
||||
ORDER BY "createTime" ASC
|
||||
) AS rn,
|
||||
-- 定义pet_group用于筛选多余组
|
||||
CASE
|
||||
WHEN (data->>'ID')::INT BETWEEN 1 AND 3 THEN 'group_1_3'
|
||||
WHEN (data->>'ID')::INT BETWEEN 4 AND 6 THEN 'group_4_6'
|
||||
WHEN (data->>'ID')::INT BETWEEN 7 AND 9 THEN 'group_7_9'
|
||||
WHEN (data->>'ID')::INT BETWEEN 301 AND 303 THEN 'group_301_303'
|
||||
WHEN (data->>'ID')::INT BETWEEN 304 AND 306 THEN 'group_304_306'
|
||||
WHEN (data->>'ID')::INT BETWEEN 307 AND 309 THEN 'group_307_309'
|
||||
END AS pet_group
|
||||
FROM "player_pet"
|
||||
WHERE deleted_at IS NULL
|
||||
),
|
||||
excess_groups AS (
|
||||
SELECT player_id, pet_group
|
||||
FROM pet_group_mapping
|
||||
WHERE pet_group IS NOT NULL
|
||||
GROUP BY player_id, pet_group
|
||||
HAVING COUNT(*) > 1
|
||||
)
|
||||
DELETE FROM "player_pet"
|
||||
WHERE id IN (
|
||||
SELECT pgm.id
|
||||
FROM pet_group_mapping pgm
|
||||
INNER JOIN excess_groups eg ON pgm.player_id = eg.player_id AND pgm.pet_group = eg.pet_group
|
||||
WHERE pgm.rn > 1
|
||||
);
|
||||
@@ -1,11 +1,50 @@
|
||||
SELECT
|
||||
player_id,
|
||||
COUNT(*) AS pet_count
|
||||
FROM
|
||||
"player_pet"
|
||||
WHERE
|
||||
(data->>'ID')::INT IN (273, 274) -- 适配JSONB的data字段取id并转整型
|
||||
GROUP BY
|
||||
player_id
|
||||
HAVING
|
||||
COUNT(*) >= 2; -- 筛选出拥有273/274宠物的玩家,可根据需求调整为>=2(同时拥有两者)
|
||||
-- 验证:查询宠物ID为273/274、玩家拥有≥2条且非最早创建的记录(只查不删)
|
||||
WITH player_pet_ranked AS (
|
||||
SELECT
|
||||
id, -- 记录主键ID
|
||||
player_id,
|
||||
(data->>'ID')::INT AS pet_id, -- 便于核对宠物ID
|
||||
"createTime",
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY player_id
|
||||
ORDER BY "createTime" ASC
|
||||
) AS rn
|
||||
FROM "player_pet"
|
||||
WHERE (data->>'ID')::INT IN (273, 274) -- 改为273或274
|
||||
)
|
||||
SELECT *
|
||||
FROM player_pet_ranked
|
||||
WHERE rn > 1 -- rn>1是要删除的记录
|
||||
AND player_id IN (
|
||||
SELECT player_id
|
||||
FROM player_pet_ranked
|
||||
GROUP BY player_id
|
||||
HAVING COUNT(*) >= 2
|
||||
);
|
||||
|
||||
|
||||
|
||||
-- 核心删除:保留每个玩家下273/274宠物中createTime最早的那条,删除其余
|
||||
WITH player_pet_ranked AS (
|
||||
SELECT
|
||||
id, -- 必须取主键ID用于精准删除
|
||||
player_id,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY player_id
|
||||
ORDER BY "createTime" ASC
|
||||
) AS rn
|
||||
FROM "player_pet"
|
||||
WHERE (data->>'ID')::INT IN (273, 274) -- 关键修改:70→273,274
|
||||
)
|
||||
DELETE FROM "player_pet"
|
||||
WHERE id IN (
|
||||
SELECT id
|
||||
FROM player_pet_ranked
|
||||
WHERE rn > 1 -- 删除非最早的记录
|
||||
AND player_id IN (
|
||||
SELECT player_id
|
||||
FROM player_pet_ranked
|
||||
GROUP BY player_id
|
||||
HAVING COUNT(*) >= 2 -- 仅处理拥有≥2条273/274宠物的玩家
|
||||
)
|
||||
);
|
||||
Reference in New Issue
Block a user