1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful

This commit is contained in:
昔念
2026-02-12 12:43:28 +08:00
parent d0cf598ced
commit 2f756c77bb
9 changed files with 128 additions and 18 deletions

45
help/三主宠查询.sql Normal file
View 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
);

View File

@@ -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) -- 关键修改70273,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宠物的玩家
)
);