作者asleepme (500年沒換暱稱了)
看板Soft_Job
標題[請益] sql greatest-n-per-group 問題
時間Tue Sep 18 23:09:05 2018
最近遇到好多sql問題..
這個greatest-n-per-group的解法似乎很經典,但是有點不懂
參考這個問題跟解答
https://stackoverflow.com/questions/7745609/
裡面的這個sql
SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;
為什麼最後WHERE b.id IS NULL會得到最大值的那些row
雖然裡面有講當得到最大值的時候 right會是NULL
但是就是不懂為什麼會是NULL啊 XD
是一個類似"反向選取"的概念嗎?
有人可以提供詳細說明嗎 Orz
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.219.82
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1537283349.A.ADB.html
1F:→ forever84721: 都講出來了 join不到東西就null呀 感覺不是很常寫jo 09/18 23:26
2F:→ forever84721: in? 09/18 23:26
4F:→ alan3100: 可改where not exists(...id=id and rev<rev)比較好理解 09/18 23:35
5F:→ asleepme: 也就是說,join不到的東西還是可以拿來做判斷 09/18 23:48
6F:→ asleepme: sorry 的確不熟 QQ 09/18 23:48
7F:→ ChungLi5566: 你把WHERE拿掉跑一次就知道了 09/19 00:09
8F:→ asleepme: 其實我拿掉where過,出來的結果就是跟想像的join一樣 09/19 00:37
9F:→ asleepme: 但是加了那個WHERE後的結果很難從不加推演過來 Orz 09/19 00:38
10F:→ fukinhot: 看到這需求 我直覺就是用row_num partition by rev ord 09/19 07:47
11F:→ fukinhot: er by rev desc as rn 再取 rn = 1 09/19 07:47
12F:→ fukinhot: 建議你試試看 很直覺 09/19 07:47
13F:→ alan3100: 是row_num over (partition by id order by rev desc) 09/19 08:07
14F:→ keyboard56: 試想rev 3大於 2 和 1所以id爲1的資料只有rev爲3的等 09/19 12:23
15F:→ keyboard56: 於。不符合條件 自然那筆資料b的id會帶空值。所以資 09/19 12:23
16F:→ keyboard56: 料a的3就被篩選出來了~ 09/19 12:23
17F:→ keyboard56: 這比較不直覺 當然用partition較直覺 09/19 12:25