SQL - Получить предыдущие суммы за каждый день - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь написать запрос, который похож на промежуточный итог, но не совсем. Я хочу получить предыдущий вес (кг) и продолжать выводить его для каждого дня, пока не будет записан другой вес (кг), затем продолжить выводить его до следующего записанного веса. Ниже приведен пример того, что я пытаюсь выполнить sh (см. Столбец КГ).

Текущие результаты:

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 голосов
/ 07 января 2020

Решение может быть достигнуто путем объединения 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

Примечание: в нем не рассматривается конкретный случай, когда первая запись равна нулю.

0 голосов
/ 07 января 2020

В стандартном SQL вы должны использовать lag() с опцией ignore nulls:

select t.*,
       lag(kg ignore nulls) over (order by calendar_dt)
from t;

Не все базы данных поддерживают ignore nulls. Но это стандарт SQL, и вы не указали базу данных, которую используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...