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

看板Soft_Job作者 (500年沒換暱稱了)時間7年前 (2018/09/18 23:09), 編輯推噓1(1016)
留言17則, 7人參與, 7年前最新討論串1/1
最近遇到好多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://www.ptt.cc/bbs/Soft_Job/M.1537283349.A.ADB.html

09/18 23:26, 7年前 , 1F
都講出來了 join不到東西就null呀 感覺不是很常寫jo
09/18 23:26, 1F

09/18 23:26, 7年前 , 2F
in?
09/18 23:26, 2F

09/18 23:31, 7年前 , 3F
定義看一下 https://goo.gl/Hm1GCn
09/18 23:31, 3F

09/18 23:35, 7年前 , 4F
可改where not exists(...id=id and rev<rev)比較好理解
09/18 23:35, 4F

09/18 23:48, 7年前 , 5F
也就是說,join不到的東西還是可以拿來做判斷
09/18 23:48, 5F

09/18 23:48, 7年前 , 6F
sorry 的確不熟 QQ
09/18 23:48, 6F

09/19 00:09, 7年前 , 7F
你把WHERE拿掉跑一次就知道了
09/19 00:09, 7F

09/19 00:37, 7年前 , 8F
其實我拿掉where過,出來的結果就是跟想像的join一樣
09/19 00:37, 8F

09/19 00:38, 7年前 , 9F
但是加了那個WHERE後的結果很難從不加推演過來 Orz
09/19 00:38, 9F

09/19 07:47, 7年前 , 10F
看到這需求 我直覺就是用row_num partition by rev ord
09/19 07:47, 10F

09/19 07:47, 7年前 , 11F
er by rev desc as rn 再取 rn = 1
09/19 07:47, 11F

09/19 07:47, 7年前 , 12F
建議你試試看 很直覺
09/19 07:47, 12F

09/19 08:07, 7年前 , 13F
是row_num over (partition by id order by rev desc)
09/19 08:07, 13F

09/19 12:23, 7年前 , 14F
試想rev 3大於 2 和 1所以id爲1的資料只有rev爲3的等
09/19 12:23, 14F

09/19 12:23, 7年前 , 15F
於。不符合條件 自然那筆資料b的id會帶空值。所以資
09/19 12:23, 15F

09/19 12:23, 7年前 , 16F
料a的3就被篩選出來了~
09/19 12:23, 16F

09/19 12:25, 7年前 , 17F
這比較不直覺 當然用partition較直覺
09/19 12:25, 17F
文章代碼(AID): #1ReHKLhR (Soft_Job)