[请益] 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