假設我有一個如下所示的表:
---- ------ ---------
| id | time | message |
---- ------ ---------
| 1 | 10 | x |
| 2 | 12 | y |
| 1 | 13 | z |
| 2 | 14 | x |
| 1 | 15 | y |
---- ------ ---------
我想撰寫一個查詢,回傳每個 id 的最新訊息。這是我的查詢:
WITH tmp AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY time DESC) as rn
FROM ##TempTable
)
SELECT *
FROM tmp
WHERE rn = 1
回傳:
---- ------ --------- ----
| id | time | message | rn |
---- ------ --------- ----
| 1 | 15 | y | 1 |
| 2 | 14 | x | 1 |
---- ------ --------- ----
我想添加一個條件,對于特定的 id,如果我看到訊息“z”,那么無論時間是什么都只保留該行,但如果“z”不在訊息中,則保留該 id 的最新行. 因此,所需的輸出類似于:
---- ------ --------- ----
| id | time | message | rn |
---- ------ --------- ----
| 1 | 13 | z | ? |
| 2 | 14 | x | 1 |
---- ------ --------- ----
知道如何修改查詢嗎?
uj5u.com熱心網友回復:
這是一種方法:
select * from (
select *, row_number() over (partition by id order by case when message = 'z' then 1 else 0 end desc, time desc ) rn
from data ) t
where rn = 1
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/403167.html
標籤:
上一篇:將DataFrame串列傳遞給嵌入在R中的SQL查詢中的WHERE子句
下一篇:按天分組,但也顯示當天的時間
