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