有一個 DB 表“SiteTransactions”(在 Sql Server 中),其當前具有以下示例格式的記錄
ID | 交易類型 | 站點組 | 站點名稱 | 交易時間 |
---|---|---|---|---|
1 | 創建 | SG1 | 測試站點1 | 2021-08-27 19:22:26.4318370 |
2 | 刪除 | SG1 | 測試站點1 | 2021-08-28 09:22:26.4318370 |
3 | 創建 | SG2 | 測試站點2 | 2021-08-28 10:12:26.4318370 |
4 | 創建 | SG1 | 測試站點3 | 2021-08-29 19:22:00.4318370 |
5 | 刪除 | SG2 | 測試站點2 | 2021-08-30 08:04:26.4318370 |
6 | 創建 | SG2 | 測試站點2 | 2021-08-31 20:18:26.4318370 |
7 | 刪除 | SG2 | 測試站點2 | 2021-08-31 20:20:26.4318370 |
此表存儲所有 SiteName 事務詳細信息。創建和刪除事務都存儲在同一個表中。這裡的問題是沒有專用的標識符列可以判斷給定的 SiteGroup-SiteName 組合當前是否處於活動狀態(即尚未被刪除)
SiteName 始終是唯一的,並且沒有 2 個活動的SiteName 可以具有相同的名稱,除非先前已刪除給定的 SiteName。上表示例中的“TestSite2”。
上面提到的要求是獲取尚未刪除的僅活動的 SiteGroup-SiteName 組合列表。
這樣做的唯一方法是檢查任何 SiteGroup-SiteName 組合是否具有刪除事務類型值並比較事務時間。
上述示例表的正確輸出應如下所示,因為只有 TestSite3 創建後未被刪除(因此它被認為是活動的):
ID | 交易類型 | 站點組 | 站點名稱 |
---|---|---|---|
4 | 創建 | SG1 | 測試站點3 |
現在我已經通過對 TransactionTime 時間戳進行commapring來構建以下查詢:
SELECT DISTINCT(A.SiteName), A.SiteGroup, A.TransactionType, A.TransactionTime
FROM SiteTransactions A, SiteTransactions B
WHERE A.SiteName= B.SiteNameAND A.SiteGroup = B.SiteGroup
AND A.TransactionType = 'Create'
AND A.TransactionTime> B.TransactionTime
ORDER BY A.TransactionTime DESC
但是我的查詢的問題是它也返回 TestSite2 記錄(已被刪除兩次),因為我已經進行了 TransactionTime 比較檢查
我需要做哪些調整才能獲得所需的輸出?
您可以為此使用條件窗口計數
SELECT
Id,
TransactionType,
SiteGroup,
SiteName
FROM (
SLEECT *,
cnt = COUNT(CASE WHEN TransactionType = 'Delete' THEN 1 END)
OVER (PARTITION BY SiteGroup, SiteName
ORDER BY TransactionTime ROWS UNBOUNDED PRECEDING)
FROM YourTable t
) t
WHERE cnt = 0;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句