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

根据DB2中一个月的第一条和最后一条记录获取字段的值,db2,Db2,我有一个查询,每个月都会显示结果。从这个查询中,我需要获取一个月的读数和该月的第一次和最后一次读数。我可以使用CASE进行SUM,但是我无法获取第一个和最后一个读数,获取该读数的条件是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',

我有一个查询,每个月都会显示结果。从这个查询中,我需要获取一个月的读数和该月的第一次和最后一次读数。我可以使用CASE进行SUM,但是我无法获取第一个和最后一个读数,获取该读数的条件是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
试试这个:

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;