测试数据如下:
TicketID userid goods_id create_time
11012451 1012 1 2020-06-01 11:11:11
11012452 1012 2 2020-06-01 11:11:11
11012453 1012 3 2020-06-01 11:11:11
11012454 1012 1 2020-06-01 11:11:11
11012455 1012 1 2020-06-01 11:11:11
11012456 1012 2 2020-06-01 11:11:11
11012457 1012 2 2020-06-01 11:11:11
11012458 1012 2 2020-06-01 11:11:11
11012459 1012 3 2020-06-01 11:11:11
11012460 1012 3 2020-06-01 11:11:11
11012461 1034 1 2020-06-01 11:11:11
11012462 1034 2 2020-06-01 11:11:11
11012463 1034 3 2020-06-01 11:11:11
11012464 1034 1 2020-06-01 11:11:11
11012465 1034 1 2020-06-01 11:11:11
11012466 1034 2 2020-06-01 11:11:11
11012467 1034 2 2020-06-01 11:11:11
11012468 1034 2 2020-06-01 11:11:11
11012469 1034 3 2020-06-01 11:11:11
11012470 1034 3 2020-06-01 11:11:11
创建时间是不同的,这里没有显示出来。
我想要的结果是,每个用户最后三种商品的数量例如 userid 为 1012 的最后 3 种商品为 1 、2 、3,数量分别为 2 、3 、2,虽然前面也出现该商品但是不统计,这种能实现吗?
userid goodsid count
1012 1 2
1012 2 3
1012 3 2
1034 1 2
1034 2 3
1034 3 2
......
我尝试用分组,但是这个是统计所有的,每个用户最后三个商品的购买日期不同,不能直接按分组统计。 所以卡在这了。
另外,送一张微信泰康洗牙券,因为疫情原因,上个月北京这边也不让去,昨天用了一个,另一个快过期了,还有一两天,好像可以约到下个月,里面只有泰康拜博可以选。
1
lpts007 2020-06-06 20:47:26 +08:00
最后 3 种商品理解不能。告辞
|
3
LinJunzhu 2020-06-06 21:13:37 +08:00
最后三种商品, 你是指以订单创建时间来倒序算,三种商品?
如果是的话,你这样是没法用一条 sql 查出的,你只能分开先查到用户的三件商品是什么了 |
6
wanv1171 2020-06-06 23:16:26 +08:00 1
https://www.db-fiddle.com/#&togetherjs=I0TE76w39N
''' WITH goods_cte AS ( SELECT * FROM ( SELECT userid, goods_id, ROW_NUMBER() OVER(PARTITION BY userid ORDER BY last_order_time DESC) AS last_n_order_item FROM ( SELECT userid, goods_id, MAX(create_time) AS last_order_time FROM test_order GROUP BY userid, goods_id ) AS t ) AS t_1 WHERE last_n_order_item <= 3 ) SELECT test_order.userid, test_order.goods_id, COUNT(TicketID) FROM test_order JOIN goods_cte ON test_order.userid = goods_cte.userid AND test_order.goods_id = goods_cte.goods_id GROUP BY test_order.userid, test_order.goods_id; ''' 这样应该可以 |
7
wanv1171 2020-06-06 23:17:54 +08:00
|
13
undefind OP @wanv1171 可能是我表达的不够清楚,不是统计最后一天,是统计最后出现的三种商品的种类数量,例如 goods_id:2 、2 、3 、1 、1 、1 、2 、3 、3,只统计 1 的 3 个 2 的 1 个 3 的 2 个,这种。。。能不能在 sql 实现
|
14
wanv1171 2020-06-07 00:34:45 +08:00
@undefind dbfiddle 的结果不是预期的么?我理解的是你想要 对于每一个用户最后购买的三种商品,统计这三种商品用户总共买过多少个。
|
15
wanv1171 2020-06-07 00:36:22 +08:00
@undefind 我又读了一遍,'例如 goods_id:2 、2 、3 、1 、1 、1 、2 、3 、3' 这个例子里面,为什么前三个 goods_id 被排除了呢?
|
17
wanv1171 2020-06-07 00:54:02 +08:00
@undefind https://www.db-fiddle.com/f/eh62B2B62Au3vddW3P3J7p/5 那你看看这个应该你想要的
|
18
wanv1171 2020-06-07 01:01:23 +08:00
@undefind 上面那个是最后同一个 timestamp 的,如果你要想看最后一天同一天的就用这个 https://www.db-fiddle.com/f/eh62B2B62Au3vddW3P3J7p/6
|
19
undefind OP @wanv1171 非常感谢您的回复,链接里例子这个 1012 的用户,最后几个值似乎有点问题,goods_id 为 2 的应该是 2 个,goods_id 为 3 的应该是 3 个
|
21
wanv1171 2020-06-07 01:09:37 +08:00
@undefind https://www.db-fiddle.com/f/eh62B2B62Au3vddW3P3J7p/7 这个是统计从最后一单倒数三天内的
|
22
undefind OP @wanv1171 抱歉,我觉得我表达错误,给你误导了,我的想法是 看最后几天这个人买的最后 3 种商品,并分别统计最后这几天的商品数量。就像我上面例子说的 goods_id:2 、2 、3 、1 、1 、1 、2 、3 、3,这个统计 goodsid 1 的有 3 个,goodsid 2 的有 1 个,goodsid 3 的有两个
|
23
undefind OP @wanv1171 非常非常感谢,这个我试了符合我的需求。请您加我微信,给您发个小红包表达谢意 ZHlsYW4zMjE5ODc=
|
24
wanv1171 2020-06-07 01:15:56 +08:00
@undefind 哦,那也蛮简单的。把我的 cte 里面的 inner query 加一个 date filter 就解决了
|
28
qinrui 2020-06-07 08:25:18 +08:00 via iPhone
按照 用户,商品 group 一次,取 max (流水号),拿到每个用户最后三种商品,然后用这个做条件,再来一次查询,即可了。
优惠券是不是可以来一个? |