通過過濾掉其餘記錄來識別活動記錄的 SQL 查詢

人類先生

有一個 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章