我正在嘗試對以下資料子集進行排名;

實作第 1 行的排名,對于前兩行,使其輸出類似于以下內容;

這是 SQL 小提琴示例;
http://sqlfiddle.com/#!18/f7690e/2
uj5u.com熱心網友回復:
這似乎是一個經典的差距和島嶼問題。
您想按日期對每個電子郵件島進行排名。一個常見的(如果不是特別有效)解決方案是使用LAG檢查前一行,然后使用視窗條件COUNT來創建編號。
SELECT
CustomerId,
QuoteEmail,
CreatedDateTime,
OverallQuoteRank,
COUNT(CASE WHEN PrevEmail = QuoteEmail THEN NULL ELSE 1 END) OVER (PARTITION BY CustomerId ORDER BY CreatedDateTime DESC)
FROM (
SELECT *,
PrevEmail = LAG(QuoteEmail) OVER (PARTITION BY CustomerId ORDER BY CreatedDateTime DESC)
FROM temptable tt
) tt;
SQL小提琴
uj5u.com熱心網友回復:
您的資料似乎成對輸入,您可以將CreatedDateTime列格式化為小時和分鐘以創建“配對密鑰”。
我不認為這個解決方案是完美的,因為CreatedDateTime可以使用不匹配的小時和分鐘值(即2022-10-11 12:30和2022-10-11 12:31)插入一個值。您可以使用您的OverallRank列來創建更好的配對密鑰,但如果我是您,我會創建一個新列以在您的INSERT.
一旦你建立了一個密鑰,你就可以用DENSE_RANK它來做剩下的事情。
話雖如此,此查詢對于您提供的示例資料來說已經足夠了:
SELECT *,
DENSE_RANK() OVER(ORDER BY FORMAT(CreatedDateTime,'hh:mm') DESC, CustomerId, QuoteEmail) AS ExpectedOutcome
FROM temptable
ORDER BY OverallQuoteRank DESC
在這里拉小提琴。
結果:
| 客戶ID | 報價電子郵件 | 創建日期時間 | 總體報價排名 | 預期結果 |
|---|---|---|---|---|
| 99888 | [email protected] | 2022-10-11 12:30:15.560 | 10 | 1 |
| 99888 | [email protected] | 2022-10-11 12:30:05.297 | 9 | 1 |
| 99888 | [email protected] | 2022-10-11 12:29:44.287 | 8 | 2 |
| 99888 | [email protected] | 2022-10-11 12:29:43.060 | 7 | 2 |
| 99888 | [email protected] | 2022-10-11 12:29:42.017 | 6 | 2 |
| 99888 | [email protected] | 2022-10-11 12:29:28.853 | 5 | 2 |
| 99888 | [email protected] | 2022-10-11 12:29:14.557 | 4 | 3 |
| 99888 | [email protected] | 2022-10-11 12:29:05.027 | 3 | 3 |
| 99888 | [email protected] | 2022-10-11 12:28:39.673 | 2 | 4 |
| 99888 | [email protected] | 2022-10-11 12:28:24.257 | 1 | 4 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/514565.html
上一篇:將字串轉換為日期
