我正在尝试编写一个查询,类似于总运行时间,但不是真的。我想获取之前的体重(kg),并每天输出,直到记录了另一个体重(kg),然后继续输出直到记录下一个体重。下面是我要完成的工作的示例(请参阅KG列)。
当前结果:
ENCOUNTER_ID | KG | DATE_RECORDED | CALENDAR_DT
-----------------------------------------------
100 10 2019-01-01 2019-01-01
NULL NULL NULL 2019-01-02
100 12 2019-01-03 2019-01-03
NULL NULL NULL 2019-01-04
NULL NULL NULL 2019-01-05
NULL NULL NULL 2019-01-06
100 13 2019-01-07 2019-01-07
NULL NULL NULL 2019-01-08
所需结果:
ENCOUNTER_ID | KG | DATE_RECORDED | CALENDAR_DT
-----------------------------------------------
100 10 2019-01-01 2019-01-01
NULL 10 NULL 2019-01-02
100 12 2019-01-03 2019-01-03
NULL 12 NULL 2019-01-04
NULL 12 NULL 2019-01-05
NULL 12 NULL 2019-01-06
100 13 2019-01-07 2019-01-07
NULL 13 NULL 2019-01-08
答案 0 :(得分:0)
在标准SQL中,您可以将lag()
与ignore nulls
选项一起使用:
select t.*,
lag(kg ignore nulls) over (order by calendar_dt)
from t;
并非所有数据库都支持ignore nulls
。但这是标准的SQL,您尚未指定要使用的数据库。
答案 1 :(得分:0)
可以通过将CASE
与子查询结合使用来获得解决方案,该子查询将获取数据排序的第一个有效值。
请参见下面的使用T-SQL的示例。
create table dbo.WeightLog
(
ENCOUNTER_ID int null,
KG int null,
DATE_RECORDED date null,
CALENDAR_DT date not null
)
GO
insert into dbo.WeightLog values
(100 , 10, '2019-01-01', '2019-01-01'),
(NULL, NULL, NULL, '2019-01-02'),
(100 , 12, '2019-01-03', '2019-01-03'),
(NULL, NULL, NULL, '2019-01-04'),
(NULL, NULL, NULL, '2019-01-05'),
(NULL, NULL, NULL, '2019-01-06'),
(100 , 13, '2019-01-07', '2019-01-07'),
(NULL, NULL, NULL, '2019-01-08')
GO
select
wl.ENCOUNTER_ID,
case when wl.KG is null
then (select top 1 x.KG from dbo.WeightLog x where x.CALENDAR_DT < wl.CALENDAR_DT
and x.KG is not null order by x.CALENDAR_DT desc)
else wl.KG end as [Kg],
wl.DATE_RECORDED,
wl.CALENDAR_DT
from dbo.WeightLog wl
结果:
ENCOUNTER_ID Kg DATE_RECORDED CALENDAR_DT ------------ ----------- ------------- ----------- 100 10 2019-01-01 2019-01-01 NULL 10 NULL 2019-01-02 100 12 2019-01-03 2019-01-03 NULL 12 NULL 2019-01-04 NULL 12 NULL 2019-01-05 NULL 12 NULL 2019-01-06 100 13 2019-01-07 2019-01-07 NULL 13 NULL 2019-01-08
注意:它不会探讨第一个记录为空的特殊情况。