如何通过 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;
我写了一个 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;