无法根据时间戳按日期分组

Can Not Group By on DATE from Timestamp

我无法根据以下查询中的时间戳列按日期分组:

 
CHG_TABLE
+----+--------+----------------+-----------------+-------+-----------+
| Key|Seq_Num | Start_Date     | End_Date        | Value |Record_Type|
+----+--------+----------------+-----------------+-------+-----------+
| 1  | 1      | 5/25/2019 2.05 | 12/31/9999 00.00| 800   | Insert    |
| 1  | 1      | 5/25/2019 2.05 | 5/31/2019 11.12 | 800   | Update    |
| 1  | 2      | 5/31/2019 11.12| 12/31/9999 00.00| 900   | Insert    |
| 1  | 2      | 5/31/2019 11.12| 6/15/2019 12.05 | 900   | Update    |
| 1  | 3      | 6/15/2019 12.05| 12/31/9999 00.00| 1000  | Insert    |
| 1  | 3      | 6/15/2019 12.05| 6/25/2019 10.20 | 1000  | Update    |
+---+---------+----------------+-----------------+-------+-----------+
RESULT:

+-----+------------------+----------------+-----------+----------+
| Key | Month_Start_Date | Month_End_Date |Begin_Value|End_Value |
+---- +------------------+----------------+-----------+----------+
| 1   | 6/1/2019         | 6/30/2019      | 1700      | 1000     |
| 1   | 7/1/2019         | 7/31/2019      | 1000      | 1000     |
+-----+------------------+----------------+-----------+----------+

Begin_Value : Sum(Value) for Max(Start_Date) < Month_Start_Date -> Should pick up latest date from last month

End_Value : Sum(Value) for Max(Start_Date) <= Month_End_Date -> Should pick up the latest date

SELECT k.key, 
       dd.month_start_date, 
       dd.month_end_date,
       gendata.value first_value,
       gendata.next_value last_value 
FROM    dim_date dd CROSS JOIN  dim_person k 
JOIN (SELECT ct.key, 
       dateadd('day',1,last_day(ct.start_date)) start_date , 
       SUM(ct.value), 
       lead(SUM(ct.value)) OVER(ORDER BY ct.start_date) next_value
FROM  (SELECT key,to_char(start_Date,'MM-YYYY') MMYYYY, max(start_Date) start_date
        FROM CHG_TABLE
        GROUP BY to_char(start_Date,'MM-YYYY'), key
       ) dt JOIN CHG_TABLE ct ON
        dt.start_date = ct.start_date AND 
        dt.key = ct.key
group by ct.key, to_char(start_Date,'MM-YYYY')
) gendata ON
    to_char(dd.month_end_date,'MM-YYYY') = to_char(to_char(start_Date,'MM-YYYY')) AND 
    k.key = gendata.key;

错误:

start_Date is not a valid group by expression

相关post:

我假设您得到的是 "ORA-00979: not a GROUP BY expression",这是因为您在 GROUP BY 子句中使用了 TO_CHAR(timestamp_col,'DD-MM-YYYY')

TO_CHAR(timestamp_col,'DD-MM-YYYY') 添加到语句的 select 一侧应该可以解决此问题并提供您期望的结果。

a, b, dateadd('day',1,last_day(timestamp_col)) start_date,  TO_CHAR(timestamp_col,'DD-MM-YYYY'), ...```

希望我正确理解你的问题。

您可以查看以下查询

WITH chg_table ( key, seq_num,  start_date, end_date, value, record_type ) AS
( 
SELECT 1,1,TO_DATE('5/25/2019  2.05','MM/DD/YYYY HH24.MI'),TO_DATE('12/31/9999 00.00','MM/DD/YYYY HH24.MI'), 800, 'Insert' FROM DUAL UNION ALL
SELECT 1,1,TO_DATE('5/25/2019  2.05','MM/DD/YYYY HH24.MI'),TO_DATE('5/31/2019  11.12','MM/DD/YYYY HH24.MI'), 800, 'Update' FROM DUAL UNION ALL
SELECT 1,2,TO_DATE('5/31/2019 11.12','MM/DD/YYYY HH24.MI'),TO_DATE('12/31/9999 00.00','MM/DD/YYYY HH24.MI'), 900, 'Insert' FROM DUAL UNION ALL
SELECT 1,2,TO_DATE('5/31/2019 11.12','MM/DD/YYYY HH24.MI'),TO_DATE('6/15/2019  12.05','MM/DD/YYYY HH24.MI'), 900, 'Update' FROM DUAL UNION ALL
SELECT 1,3,TO_DATE('6/15/2019 12.05','MM/DD/YYYY HH24.MI'),TO_DATE('12/31/9999 00.00','MM/DD/YYYY HH24.MI'), 1000, 'Insert' FROM DUAL UNION ALL
SELECT 1,3,TO_DATE('6/15/2019 12.05','MM/DD/YYYY HH24.MI'),TO_DATE('6/25/2019  10.20','MM/DD/YYYY HH24.MI'), 1000, 'Update' FROM DUAL
)
select key , new_start_date Month_Start_Date , new_end_date Month_End_Date , begin_value ,
nvl(lead(begin_value) over(order by new_start_date),begin_value) end_value
from
(
select key , new_start_date , new_end_date , sum(value) begin_value
from
(
select key, seq_num,  start_date
, value, record_type ,
trunc(add_months(start_date,1),'month') new_start_date , 
trunc(add_months(start_date,2),'month')-1 new_end_date 
from chg_table
where record_type = 'Insert'
)
group by key , new_start_date , new_end_date
)
order by new_start_date
;

Db Fiddle link: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c77a71afa82769b48f424e1c0fa1c0b6