问下这个 SQL 怎么写,订单表获取每个用户最后三个商品种类统计,另外,送一个洗牙券

2020-06-06 20:22:45 +08:00
 undefind

测试数据如下:

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  
......

我尝试用分组,但是这个是统计所有的,每个用户最后三个商品的购买日期不同,不能直接按分组统计。 所以卡在这了。

另外,送一张微信泰康洗牙券,因为疫情原因,上个月北京这边也不让去,昨天用了一个,另一个快过期了,还有一两天,好像可以约到下个月,里面只有泰康拜博可以选。

2857 次点击
所在节点    问与答
30 条回复
lpts007
2020-06-06 20:47:26 +08:00
最后 3 种商品理解不能。告辞
undefind
2020-06-06 21:08:40 +08:00
@lpts007 这个是不是用 SQL 实现不了
LinJunzhu
2020-06-06 21:13:37 +08:00
最后三种商品, 你是指以订单创建时间来倒序算,三种商品?

如果是的话,你这样是没法用一条 sql 查出的,你只能分开先查到用户的三件商品是什么了
undefind
2020-06-06 21:14:57 +08:00
@lpts007 洗牙券需要不,送了,拜博的
undefind
2020-06-06 21:17:07 +08:00
@LinJunzhu 是的,最后购买的三种商品,有可能这种商品只有一个,也有可能连续多个
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;
'''

这样应该可以
wanv1171
2020-06-06 23:17:54 +08:00
https://www.db-fiddle.com/f/eh62B2B62Au3vddW3P3J7p/0

上面那个链接加错了,应该是这个
undefind
2020-06-07 00:10:50 +08:00
@wanv1171 感谢,我试一下。另外问下你需要洗牙券不,我这有张马上过期了
wanv1171
2020-06-07 00:12:46 +08:00
@undefind 谢谢,不过用不上,哈哈
undefind
2020-06-07 00:16:30 +08:00
@wanv1171 刚试了下,好像不太符合我的需求,这个语句会把用户所有的 goods_id 相同的都统计上去
wanv1171
2020-06-07 00:20:08 +08:00
@undefind 大概意思是只统计最后一天的?
wanv1171
2020-06-07 00:29:33 +08:00
@undefind 没太明白'所有的 goods_id 相同的'是什么意思
undefind
2020-06-07 00:31:17 +08:00
@wanv1171 可能是我表达的不够清楚,不是统计最后一天,是统计最后出现的三种商品的种类数量,例如 goods_id:2 、2 、3 、1 、1 、1 、2 、3 、3,只统计 1 的 3 个 2 的 1 个 3 的 2 个,这种。。。能不能在 sql 实现
wanv1171
2020-06-07 00:34:45 +08:00
@undefind dbfiddle 的结果不是预期的么?我理解的是你想要 对于每一个用户最后购买的三种商品,统计这三种商品用户总共买过多少个。
wanv1171
2020-06-07 00:36:22 +08:00
@undefind 我又读了一遍,'例如 goods_id:2 、2 、3 、1 、1 、1 、2 、3 、3' 这个例子里面,为什么前三个 goods_id 被排除了呢?
undefind
2020-06-07 00:45:19 +08:00
@wanv1171 我是想要他最后一段时间这几种商品买了多少个,不需要以前的那些数据
wanv1171
2020-06-07 00:54:02 +08:00
wanv1171
2020-06-07 01:01:23 +08:00
@undefind 上面那个是最后同一个 timestamp 的,如果你要想看最后一天同一天的就用这个 https://www.db-fiddle.com/f/eh62B2B62Au3vddW3P3J7p/6
undefind
2020-06-07 01:04:03 +08:00
@wanv1171 非常感谢您的回复,链接里例子这个 1012 的用户,最后几个值似乎有点问题,goods_id 为 2 的应该是 2 个,goods_id 为 3 的应该是 3 个
wanv1171
2020-06-07 01:06:35 +08:00
@undefind 2 显示一个是因为这两个 ticket 不在一天,3 也是同样的道理。我感觉是想要最后几天内的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/679254

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX