SQL-获取每天的先前金额

时间:2020-01-07 13:56:58

标签: sql oracle

我正在尝试编写一个查询,类似于总运行时间,但不是真的。我想获取之前的体重(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 

2 个答案:

答案 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

注意:它不会探讨第一个记录为空的特殊情况。