作者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/cn.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