Извлечь значение поля на основе первой и последней записи месяца в DB2 - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть запрос, который приносит результат каждого месяца. Из этого запроса мне нужно получить сумму чтения за месяц, а также первое и последнее чтение за месяц. Я смог выполнить SUM с использованием CASE, однако я не могу получить первое и последнее чтение, условие для получения этого состоит в том, что TYPE = 'YYY'

SELECT g.id, g.DATE_MONTH,
  (CASE
  WHEN g.TYPE ='XXX'
  THEN (g.reading)
  ELSE NULL
  END ) AS fsum
  FROM 
  (select to_char(DATE, 'Mon YYYY', 'en_US') DATE_MONTH ,
   year(DATE) DATE_Y , 
  month(DATE) DATE_M ,
  min(DATE) as DATE_MIN ,
  max(DATE) as DATE_MAX, id,sum(reading) AS reading, TYPE
  from CXDATA 
  group by to_char(DATE, 'Mon YYYY', 'en_US'),
  year(DATE), month(DATE),id, TYPE ) g

Данные должны быть как ниже

 ID------+READING+-------STARTDATE+-----+--TYPE
 1010      250            05-Jan-2020      XXX
 1010      500            12-Jan-2020      XXX
 1010      680            20-Jan-2020      XXX
 1011      100            08-Feb-2020      YYY
 1011      340            11-Feb-2020      YYY
 1011      180            12-Feb-2020      YYY

  OUTPUT
 -----------------------------------------
  ID------+DATE_MONTH+----+FSUM+-----FIRSTREADING+-----LASTREADING+---TYPE
  1010     JAN 2020        1430       NULL               NULL         XXX
  1011     FEB 2020        NULL       100                 180         YYY

1 Ответ

1 голос
/ 13 февраля 2020

Попробуйте это:

WITH 
  TAB (ID, READING, STARTDATE, TYPE) AS
(
VALUES
  (1010, 250, DATE('2020-01-05'), 'XXX')
, (1010, 500, DATE('2020-01-12'), 'XXX')
, (1010, 680, DATE('2020-01-20'), 'XXX')
, (1011, 100, DATE('2020-02-08'), 'YYY')
, (1011, 340, DATE('2020-02-11'), 'YYY')
, (1011, 180, DATE('2020-02-12'), 'YYY')
)
SELECT 
  ID, DATE_MONTH, SUM(CASE TYPE WHEN 'XXX' THEN READING END) FSUM, FIRSTREADING, LASTREADING, TYPE
FROM
(
SELECT
  ID
, to_char(STARTDATE, 'Mon YYYY', 'en_US') DATE_MONTH
, STARTDATE, READING, TYPE
, FIRST_VALUE (CASE TYPE WHEN 'YYY' THEN READING END, 'IGNORE NULLS') OVER (PARTITION BY ID, to_char(STARTDATE, 'Mon YYYY', 'en_US') ORDER BY STARTDATE) FIRSTREADING
, FIRST_VALUE (CASE TYPE WHEN 'YYY' THEN READING END, 'IGNORE NULLS') OVER (PARTITION BY ID, to_char(STARTDATE, 'Mon YYYY', 'en_US') ORDER BY STARTDATE DESC) LASTREADING
FROM TAB
)
GROUP BY ID, DATE_MONTH, FIRSTREADING, LASTREADING, TYPE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...