如何通过 ID 号重置组

How to Make Groups Reset by ID number

我写了一个 SQL 脚本,每次都为一个新组编号 1) ID 号与之前的相比发生了变化,或者 2) 订单日期比之前的时间长了 15 分钟以上它。但是,我不想让数字从 0 到无穷大,而是希望在每次 ID 号更改时将组 # 重置为 0。请指教

此代码创建一个虚拟 table 值:

CREATE TABLE #pretemp (
 [hospital_code] varchar(255),
s_visit_ident varchar(255),
 orderdt datetime
 ); 

 INSERT INTO #pretemp ([hospital_code],s_visit_ident,orderdt)
 VALUES ('ClevelandClinic', '1', '01-02-2020 12:30'),
 ('ClevelandClinic', '1','01-02-2020 12:35'),
 ('ClevelandClinic', '1', '01-02-2020 12:42'),
 ('ClevelandClinic', '1', '01-02-2020 12:55'),
 ('ClevelandClinic', '1','01-05-2020 18:44'),
 ('ClevelandClinic', '2','01-05-2020 07:09'),
 ('ClevelandClinic', '1','01-05-2020 07:12'),
 ('ClevelandClinic', '1','01-05-2020 07:18'),
 ('ClevelandClinic', '1', '01-07-2020 00:00'),
 ('ClevelandClinic', '3','01-07-2020 00:03'),
 ('ClevelandClinic', '3','01-07-2020 00:10');

此脚本创建并添加组号。

 select hospital_code, s_visit_ident, orderdt,
 lead(orderdt,1) over (order by hospital_code, s_visit_ident,orderdt) as 'Lead Time',
 lead(s_visit_ident,1) over (order by hospital_code,s_visit_Ident,orderdt) as 'Lead pt_id',
 lag(Orderdt,1) over (order by hospital_Code, s_visit_ident,orderdt) as 'Lag',
 lag(s_visit_ident,1) over (order by hospital_code, s_visit_ident,orderdt) as 'Lag pt_id'
 into #temp
 from #pretemp
 order by hospital_code, s_visit_ident, orderdt,lead(orderdt,1) over (order by 
 hospital_code,s_visit_ident,orderdt)

 select *, 
 case when [lead pt_id] <> [s_visit_ident] then null else [lead time] end as 'Updated Lead Time',
 case when [lead pt_id] <> [s_visit_ident] then null else datediff(mi,orderdt,[lead time]) end as 
 'Timediff', 
  case when [lead pt_id] <> s_visit_ident then 0
  when datediff(mi,orderdt,[lead time]) <= 15 then 1 else 0 end as 'Tag'
  into #temp2
  From #temp
  order by s_Visit_ident,orderdt,[lead time],hospital_code


   ALTER TABLE #temp2 ADD [group] INT

   DECLARE @group INT
   SELECT @group = 0

   UPDATE ss SET [group] = @group, @group = CASE WHEN 
   s.[lag pt_id] is null then @group
   when s.[lead pt_id] is null then @group
   when
   s.[lag pt_Id] <> s.s_visit_ident then @group + 1
   --If it's the first, then if the lag time 
   when datediff(mi,ss.[lag],s.[orderdt]) > 15 then @group+1
   --If it's in the middle
   when datediff(mi,ss.[lag],s.orderdt) <= 15 and datediff(mi,s.orderdt,ss.[lead time]) <= 15 then        @group
   --If it's the last of the group
   when datediff(mi,ss.[lag],s.orderdt) <=15 and datediff(mi,s.orderdt,ss.[lead time]) > 15 then @group
   else @group + 1
   END
   FROM #temp2 
   ss JOIN (SELECT hospital_Code, s_Visit_ident, orderdt,[lag pt_id],[lead pt_id]
FROM #temp2
) s ON (ss.hospital_Code = s.hospital_Code AND ss.s_visit_ident = s.s_visit_Ident AND ss.orderdt = s.orderdt)

SELECT hospital_code AS Hospital, s_visit_Ident AS Patient, orderdt,[group]
   FROM #temp2
   GROUP BY hospital_Code,s_Visit_ident,orderdt,[group]
   ORDER BY [group] asc

这些是我得到的结果:

  Hospital                Patient            orderdt                    group
  ClevelandClinic             1                  2020-01-02 12:30:00.000    0
  ClevelandClinic             1                  2020-01-02 12:35:00.000    0
  ClevelandClinic             1                  2020-01-02 12:42:00.000    0
  ClevelandClinic             1                  2020-01-02 12:55:00.000    0
  ClevelandClinic             1                  2020-01-05 07:12:00.000    1
  ClevelandClinic             1                  2020-01-05 07:18:00.000    1
  ClevelandClinic             1                  2020-01-05 18:44:00.000    2
  ClevelandClinic             1                  2020-01-07 00:00:00.000    3
  ClevelandClinic             2                  2020-01-05 07:09:00.000    4
  ClevelandClinic             3                  2020-01-07 00:03:00.000    5
  ClevelandClinic             3                  2020-01-07 00:10:00.000    5

这些是我想要的结果:

  Hospital                Patient            orderdt                    group
  ClevelandClinic             1                  2020-01-02 12:30:00.000    0
  ClevelandClinic             1                  2020-01-02 12:35:00.000    0
  ClevelandClinic             1                  2020-01-02 12:42:00.000    0
  ClevelandClinic             1                  2020-01-02 12:55:00.000    0
  ClevelandClinic             1                  2020-01-05 07:12:00.000    1
  ClevelandClinic             1                  2020-01-05 07:18:00.000    1
  ClevelandClinic             1                  2020-01-05 18:44:00.000    2
  ClevelandClinic             1                  2020-01-07 00:00:00.000    3
  ClevelandClinic             2                  2020-01-05 07:09:00.000    0
  ClevelandClinic             3                  2020-01-07 00:03:00.000    0
  ClevelandClinic             3                  2020-01-07 00:10:00.000    0

不是每次都添加组号,而是希望每次有新的患者 ID 号时将组号重置为 0。我很感激你能给我的任何帮助。

看起来这应该在单个查询中完成。该解决方案使用常见的 table 表达式 (cte) 来计算何时递增组。之后是一个大的 sum() 函数,它产生一个 running total 的组增量。 -1 使组号从 0 开始而不是 1.

with cte as
(
select p.hospital_code,
       p.s_visit_ident,
       p.orderdt,
       case when coalesce(datediff(
         minute,
         lag(p.orderdt) over(partition by p.s_visit_ident order by p.orderdt),
         p.orderdt), 15) < 15
         then 0 else 1 end as increment_group
from #pretemp p
)
select cte.hospital_code,
       cte.s_visit_ident as patient,
       cte.orderdt,
       sum(cte.increment_group)
         over(partition by cte.s_visit_ident
              order by cte.orderdt
              rows between unbounded preceding and current row) - 1 as [group]
from cte
order by cte.s_visit_ident, cte.orderdt;

Fiddle