我需要為我似乎無法弄清楚的 Postgres 創建一個復雜的 SQL 陳述句,有人可以在這里幫助我嗎?這是我需要的:
我有一個名為 的表tags,它是一個存盤名稱和值的表,以及擁有標簽的用戶 ID 和標簽本身的 ID 等資訊。對于這個問題的背景關系,這里是您需要知道的唯一列:
id: 標簽本身的 ID (BIGSERIAL)guild_id:標簽所在公會的id(BIGINT)。公會本質上是一個巨大房間里的一大群用戶,每個標簽只關聯一個群組。owner_id: 擁有標簽的用戶的 id (BIGINT)。created_at:標簽創建時間的 UTC 時間戳 (TIMESTAMP)。
我需要允許版主將所有多余的標簽從公會中的每個用戶洗掉到特定限制,首先優先考慮舊標簽。例如,假設這是我的表:
id | guild_id | owner_id | created_at
---- -------------------- -------------------- ----------------------------
14 | 715039810976219206 | 322896727071784960 | 2022-03-30 21:47:36.81417
17 | 715039810976219206 | 600855080962490396 | 2022-03-31 00:57:18.024558
20 | 715039810976219206 | 322896727071784960 | 2022-03-31 01:03:57.586239
21 | 715039810976219206 | 322896727071784960 | 2022-03-31 01:35:13.426953
22 | 715039810976219206 | 322896727071784960 | 2022-04-14 02:02:46.852122
25 | 715039810976219206 | 322896727071784960 | 2022-04-14 02:03:13.559069
26 | 239865610974543234 | 322896727071784960 | 2022-04-14 02:03:18.885876
當版主嘗試使用限制為 3 且公會為 715039810976219206 的情況下執行此功能時,它將執行以下操作:
- 對于
owner_id列中的每個用戶,它將確定他們是否在特定 guild中擁有 3 個或更多標簽。在此示例中,用戶 322896727071784960 在公會 715039810976219206 中擁有超過 3 個標簽。 - 然后它將繼續洗掉所有標簽,直到標簽只剩下 3 個。首先要優先洗掉舊標簽,這一點很重要。在這種情況下,它將洗掉標簽 14 和 20。這將導致公會 715039810976219206 中的用戶 322896727071784960 只剩下 3 個標簽。
我已經嘗試了一段時間,如果它有幫助的話,我已經得到了:
DELETE FROM tags
WHERE id IN (
SELECT id FROM tags
WHERE guild_id = $1 AND owner_id = ???? ORDER BY created_at DESC
OFFSET $3
);
(????在那里是因為我完全失去了我正在做的事情)
希望我已經解釋得很清楚,讓你理解。任何幫助將不勝感激,如果可能的話,對答案的解釋將很有幫助。
uj5u.com熱心網友回復:
如果我正確理解您的問題,您可以使用rank()函式并按 owner_id 對它們進行分組,并按磁區日期排序。然后洗掉所有排名高于 3 的記錄。
DELETE FROM tags WHERE id in (
SELECT id FROM
(
SELECT id,
owner_id,
rank() over (partition by owner_id order by created_at desc) as rnk
FROM tags
) as t
WHERE t.rnk > 3
);
SELECT * FROM tags
db小提琴鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/479737.html
