穿梭机丶 2023-04-23 22:01 采纳率: 75%
浏览 122
已结题

Sql Sever按7天分组统计次数和金额

目的:一周内开单超过2次(上一个提问未能完全解决问题)
表名:tbs
字段如图:(该电脑没数据库,只能用excel将就,请见谅)

img

数据如下:

img

本人思路:
一、循环判断同身份证号码下,2个开单时间在7天内,即可视为同一周;
二、对“一”的结果按同一周分组,统计次数。

第一步:

SELECT * FROM
(
select a.*,ROW_NUMBER() over (PARTITION BY a.身份证号码 ORDER BY a.开单日期) as a_n,
ROW_NUMBER() over (PARTITION BY b.身份证号码 ORDER BY b.开单日期) as b_n  
from tbs a
INNER JOIN 
tbs b
ON a.身份证号码=b.身份证号码 
AND ABS( DATEDIFF(DAY,CONVERT(VARCHAR(100),a.开单日期),CONVERT(VARCHAR(100),b.开单日期)) )<7  ) kk
WHERE kk.a_n<>kk,b.n;

第二步:不会了。。想过用rank+partition之类的分组,怎么也没办法得到同一值再分组,实在想不到了。

理想结果:

img

请各位同学踊跃发言,积极讨论啦~~。在下想很久了。

  • 写回答

8条回答 默认 最新

  • leaf_cq 2023-04-24 15:10
    关注

    1、使用窗口函数吧:

    with a as (
            select 'aa' 姓名, '111' 身份证号码, convert( datetime,'2022-01-01 10:00:00' ) 开单日期, 10 金额 union all
            select 'aa' 姓名, '111' 身份证号码, convert( datetime,'2022-01-04 10:00:00' ) 开单日期, 20 金额 union all
            select 'aa' 姓名, '111' 身份证号码, convert( datetime,'2022-01-08 10:00:00' ) 开单日期, 30 金额 union all
            select 'aa' 姓名, '111' 身份证号码, convert( datetime,'2022-01-10 10:00:00' ) 开单日期, 40 金额 union all
            select 'bb' 姓名, '222' 身份证号码, convert( datetime,'2022-02-11 11:00:00' ) 开单日期, 15 金额 union all
            select 'bb' 姓名, '222' 身份证号码, convert( datetime,'2022-02-14 11:00:00' ) 开单日期, 25 金额 union all
            select 'bb' 姓名, '222' 身份证号码, convert( datetime,'2022-02-14 16:00:00' ) 开单日期, 35 金额 union all
            select 'cc' 姓名, '333' 身份证号码, convert( datetime,'2022-03-01 13:00:00' ) 开单日期, 50 金额 union all
            select 'cc' 姓名, '333' 身份证号码, convert( datetime,'2022-03-04 13:00:00' ) 开单日期, 60 金额 union all
            select 'cc' 姓名, '333' 身份证号码, convert( datetime,'2022-03-08 13:00:00' ) 开单日期, 70 金额 union all
            select 'cc' 姓名, '333' 身份证号码, convert( datetime,'2022-03-13 13:00:00' ) 开单日期, 80 金额 )
        , b as (
            select *
                 , datediff( day, 开单日期, lag( 开单日期, 2 ) over( partition by 身份证号码 order by 开单日期 ) ) 间隔前两条天数
                 , datediff( day, 开单日期, lag( 开单日期 ) over( partition by 身份证号码 order by 开单日期 ) ) 间隔前一条天数
                 , datediff( day, 开单日期, lead( 开单日期 ) over( partition by 身份证号码 order by 开单日期 ) ) 间隔后一条天数
                 , datediff( day, 开单日期, lead( 开单日期, 2 ) over( partition by 身份证号码 order by 开单日期 ) ) 间隔后两条天数
              from a )
    select 姓名, 身份证号码, 开单日期, 金额 from b where 间隔前两条天数 > -7 or 间隔后一条天数 - 间隔前一条天数 < 7 or 间隔后两条天数 < 7
    

    构建数据:

    img

    执行结果:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 5月5日
  • 已采纳回答 4月27日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件