问下这个 SQL 怎么写,订单表获取每个用户最后三个商品种类统计,另外,送一个洗牙券 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
undefind
V2EX    问与答

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

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

    测试数据如下:

    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     Solana     3021 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 00:34 PVG 08:34 LAX 17:34 JFK 20:34
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86