我有一個表,其中一個屬性是外鍵,另一個屬性是時間戳
桌子
| ID | fk | 時間戳 |
|---|---|---|
| 1 | 2 | 16-02-2022 |
| 2 | 2 | 01-02-2022 |
| 3 | 2 | 2021 年 2 月 2 日 |
| 4 | 3 | 2020 年 5 月 24 日 |
| 5 | 3 | 2022 年 11 月 1 日 |
| 6 | 3 | 16-09-2021 |
| 7 | 3 | 01-01-2022 |
我想選擇具有更多相同外鍵的 X 次出現的行,并且我想忽略每個外鍵的 X 個最近(時間戳)元素
所以基本上用 2 的 X 選擇會回傳
| ID | fk | 時間戳 |
|---|---|---|
| 3 | 2 | 2021 年 2 月 2 日 |
| 6 | 3 | 16-09-2021 |
| 4 | 3 | 2020 年 5 月 24 日 |
如果 X 為 3,則選擇將回傳
| ID | fk | 時間戳 |
|---|---|---|
| 4 | 3 | 2020 年 5 月 24 日 |
到目前為止我嘗試了什么
Declare @X=1
SELECT t.id, t.timestamp, t.fk FROM table t
WHERE t.fk IN (
SELECT o.id FROM table t
INNER JOIN otherTable o ON o.id = t.fk
GROUP BY o.id
HAVING COUNT(*) > @X)
ORDER BY t.timestamp DESC
OFFSET @X ROWS
這沒有按預期作業,因為偏移量不適用于按時間戳 DESC 排序的每個外鍵
有沒有人為此苦苦掙扎?
uj5u.com熱心網友回復:
使用COUNT()和ROW_NUMBER()視窗功能:
SELECT id, fk, timestamp
FROM (
SELECT *,
COUNT(*) OVER (PARTITION BY fk) counter,
ROW_NUMBER() OVER (PARTITION BY fk ORDER BY timestamp DESC) rn
FROM tablename
) t
WHERE counter > ? AND rn > ?;
替換?為您想要的值。
但是,如果將相同的數字 X 應用于每個fk的總行數和要關閉的行數,則可以簡化查詢:
SELECT id, fk, timestamp
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY fk ORDER BY timestamp DESC) rn
FROM tablename
) t
WHERE rn > ?;
請參閱演示。
uj5u.com熱心網友回復:
SELECT
id, fk, timestamp
FROM
(
SELECT id, fk, timestamp, ROW_NUMBER() OVER(PARTITION BY fk ORDER BY timestamp ASC) AS X,
COUNT(1) OVER(PARTITION BY fk) AS Total
FROM MyTable
) AS S
WHERE A.Total - S.X >= @X
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424984.html
上一篇:在SQL中限制LAG
