测试数据如下:
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 ![]() 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 (流水号),拿到每个用户最后三种商品,然后用这个做条件,再来一次查询,即可了。 优惠券是不是可以来一个? |