V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
undefind
V2EX  ›  问与答

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

  •  
  •   undefind · 2020-06-06 20:22:45 +08:00 · 2648 次点击
    这是一个创建于 1391 天前的主题,其中的信息可能已经有所发展或是发生改变。

    测试数据如下:

    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 条附言  ·  2020-06-06 21:26:29 +08:00
    有需要洗牙券的可以回复下,免费送了
    30 条回复    2020-06-07 10:10:37 +08:00
    lpts007
        1
    lpts007  
       2020-06-06 20:47:26 +08:00
    最后 3 种商品理解不能。告辞
    undefind
        2
    undefind  
    OP
       2020-06-06 21:08:40 +08:00
    @lpts007 这个是不是用 SQL 实现不了
    LinJunzhu
        3
    LinJunzhu  
       2020-06-06 21:13:37 +08:00
    最后三种商品, 你是指以订单创建时间来倒序算,三种商品?

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

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

    上面那个链接加错了,应该是这个
    undefind
        8
    undefind  
    OP
       2020-06-07 00:10:50 +08:00
    @wanv1171 感谢,我试一下。另外问下你需要洗牙券不,我这有张马上过期了
    wanv1171
        9
    wanv1171  
       2020-06-07 00:12:46 +08:00
    @undefind 谢谢,不过用不上,哈哈
    undefind
        10
    undefind  
    OP
       2020-06-07 00:16:30 +08:00
    @wanv1171 刚试了下,好像不太符合我的需求,这个语句会把用户所有的 goods_id 相同的都统计上去
    wanv1171
        11
    wanv1171  
       2020-06-07 00:20:08 +08:00
    @undefind 大概意思是只统计最后一天的?
    wanv1171
        12
    wanv1171  
       2020-06-07 00:29:33 +08:00
    @undefind 没太明白'所有的 goods_id 相同的'是什么意思
    undefind
        13
    undefind  
    OP
       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
        14
    wanv1171  
       2020-06-07 00:34:45 +08:00
    @undefind dbfiddle 的结果不是预期的么?我理解的是你想要 对于每一个用户最后购买的三种商品,统计这三种商品用户总共买过多少个。
    wanv1171
        15
    wanv1171  
       2020-06-07 00:36:22 +08:00
    @undefind 我又读了一遍,'例如 goods_id:2 、2 、3 、1 、1 、1 、2 、3 、3' 这个例子里面,为什么前三个 goods_id 被排除了呢?
    undefind
        16
    undefind  
    OP
       2020-06-07 00:45:19 +08:00
    @wanv1171 我是想要他最后一段时间这几种商品买了多少个,不需要以前的那些数据
    wanv1171
        17
    wanv1171  
       2020-06-07 00:54:02 +08:00
    wanv1171
        18
    wanv1171  
       2020-06-07 01:01:23 +08:00
    @undefind 上面那个是最后同一个 timestamp 的,如果你要想看最后一天同一天的就用这个 https://www.db-fiddle.com/f/eh62B2B62Au3vddW3P3J7p/6
    undefind
        19
    undefind  
    OP
       2020-06-07 01:04:03 +08:00
    @wanv1171 非常感谢您的回复,链接里例子这个 1012 的用户,最后几个值似乎有点问题,goods_id 为 2 的应该是 2 个,goods_id 为 3 的应该是 3 个
    wanv1171
        20
    wanv1171  
       2020-06-07 01:06:35 +08:00
    @undefind 2 显示一个是因为这两个 ticket 不在一天,3 也是同样的道理。我感觉是想要最后几天内的?
    wanv1171
        21
    wanv1171  
       2020-06-07 01:09:37 +08:00
    @undefind https://www.db-fiddle.com/f/eh62B2B62Au3vddW3P3J7p/7 这个是统计从最后一单倒数三天内的
    undefind
        22
    undefind  
    OP
       2020-06-07 01:11:00 +08:00
    @wanv1171 抱歉,我觉得我表达错误,给你误导了,我的想法是 看最后几天这个人买的最后 3 种商品,并分别统计最后这几天的商品数量。就像我上面例子说的 goods_id:2 、2 、3 、1 、1 、1 、2 、3 、3,这个统计 goodsid 1 的有 3 个,goodsid 2 的有 1 个,goodsid 3 的有两个
    undefind
        23
    undefind  
    OP
       2020-06-07 01:14:49 +08:00
    @wanv1171 非常非常感谢,这个我试了符合我的需求。请您加我微信,给您发个小红包表达谢意 ZHlsYW4zMjE5ODc=
    wanv1171
        24
    wanv1171  
       2020-06-07 01:15:56 +08:00
    @undefind 哦,那也蛮简单的。把我的 cte 里面的 inner query 加一个 date filter 就解决了
    wanv1171
        25
    wanv1171  
       2020-06-07 01:18:27 +08:00
    @undefind 哈哈,这个微信号怎么加啊 🤣
    undefind
        26
    undefind  
    OP
       2020-06-07 01:21:22 +08:00
    @wanv1171 base64 解码一下😁
    terlan
        27
    terlan  
       2020-06-07 03:58:48 +08:00 via iPhone
    @undefind 我也想加😂
    qinrui
        28
    qinrui  
       2020-06-07 08:25:18 +08:00 via iPhone
    按照 用户,商品 group 一次,取 max (流水号),拿到每个用户最后三种商品,然后用这个做条件,再来一次查询,即可了。


    优惠券是不是可以来一个?
    undefind
        29
    undefind  
    OP
       2020-06-07 10:06:43 +08:00
    @terlan 不好意思哈,有 v 友加微信了,直接送给他啦
    undefind
        30
    undefind  
    OP
       2020-06-07 10:10:37 +08:00
    @qinrui 这样会分别把以前也买的三种商品的数量加到一起,我这边需要的是最后连续的 3 种商品,比如 goods_id:2 、2 、3 、1 、1 、1 、2 、3 、3,就只统计 1 、1 、1 、2 、3 、3 的数量,前面的 2 、2 、3 是不加到数量里的。
    洗牙券有 v 友直接加微信了,然后送给他啦,不好意思哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3002 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 14:57 · PVG 22:57 · LAX 07:57 · JFK 10:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.