SQL分组进⾏筛选
问题:取出登录淘宝平台⽤户最近两次购买记录时间,⽅便做下⼀步营销⽅案
假设:最近⼀次只够买⼀件商品,上次可购买多件商品
select a.time,
a.user_id,
max(b.time)--可能会存在多个记录,只取最新两条记录时间
from
(select time, user_id from dengji) a
left join
(select time, user_id from dengji) b
on a.user_id = b.user_id and b.time< a.time--将两次时间相等的记录删掉
group by a.date, a.user_id
如果还需从表b中取出其他信息,eg:第⼆次购买买的商品id需要⽤row_number或者rank函数
select a.time,
a.user_id,
max(b.time)--可能会存在多个记录,只取最新两条记录时间多表left join
from
(select time, user_id from dengji) a
left join
(select time, user_id, goods_id from dengji) b
on a.user_id = b.user_id and b.time< a.time--将两次时间相等的记录删掉
group by a.date, a.user_id, b.goods_id -- select⽤到了聚合函数max,因此必须对b.goods_id进⾏分组,但是实际需求是只需要对a.time、a.user_id分组。现在分组后会对b表中不同商品分组后分别取最新时间
正确解法为
select`最新时间,
user_id,
`上次时间`,
goods_id
from
(select a.time`最新时间`,
a.user_id,
row_number()over(partition by a.time, a.user_id order by b.time desc) rank -- 会得到分组排名编号
b.time`上次时间`,--可能会存在多个记录,只取最新两条记录时间
from
(select time, user_id from dengji) a
left join
(select time, user_id, goods_id from dengji) b
on a.user_id = b.user_id and b.time< a.time)--将两次时间相等的记录删掉
where rank <=1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论