[請益] sql greatest-n-per-group 問題

作者: asleepme (500年沒換暱稱了)   2018-09-18 23:09:05
最近遇到好多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
作者: forever84721 (Jay)   2018-09-18 23:26:00
都講出來了 join不到東西就null呀 感覺不是很常寫join?
作者: zelda123 (丸子)   2018-09-18 23:31:00
定義看一下 https://goo.gl/Hm1GCn
作者: alan3100 (BOSS)   2018-09-18 23:35:00
可改where not exists(...id=id and rev<rev)比較好理解
作者: asleepme (500年沒換暱稱了)   2018-09-18 23:48:00
也就是說,join不到的東西還是可以拿來做判斷sorry 的確不熟 QQ
作者: ChungLi5566 (中壢56哥)   2018-09-19 00:09:00
你把WHERE拿掉跑一次就知道了
作者: asleepme (500年沒換暱稱了)   2018-09-19 00:37:00
其實我拿掉where過,出來的結果就是跟想像的join一樣但是加了那個WHERE後的結果很難從不加推演過來 Orz
作者: fukinhot (抱歉粗口我怕熱)   2018-09-19 07:47:00
看到這需求 我直覺就是用row_num partition by rev order by rev desc as rn 再取 rn = 1建議你試試看 很直覺
作者: alan3100 (BOSS)   2018-09-19 08:07:00
是row_num over (partition by id order by rev desc)
作者: keyboard56 (奇伯)   2018-09-19 12:23:00
試想rev 3大於 2 和 1所以id爲1的資料只有rev爲3的等於。不符合條件 自然那筆資料b的id會帶空值。所以資料a的3就被篩選出來了~這比較不直覺 當然用partition較直覺

Links booklink

Contact Us: admin [ a t ] ucptt.com