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