根据DB2中一个月的第一条记录和最后一条记录来获取字段的值

时间:2020-02-13 15:33:41

标签: db2

我有一个查询,查询每个月的结果。从这个查询中,我需要获取一个月的阅读总和以及该月的第一和最后阅读。我可以使用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 个答案:

答案 0 :(得分:1)

尝试一下:

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;