簡體   English   中英

如何比較Oracle中一組行的最大和最小日期的列值?

[英]How to compare the column values of the max and min dates of a group of rows in Oracle?

給定一個看起來像這樣的表,我將如何創建另一個獲取此數據的查詢,從該 store_id 的最早和最晚日期開始比較 sales_net_amt,並為每個 store_id 返回一行顯示純文本,以確定它是“增加”還是“減少”加班在另一列?

在此處輸入圖片說明

對於計算列,我假設我可以只使用“case when”子句,但我不確定如何導出最新和最早日期的兩個單獨值來進行比較。 我能做的最好的事情是創建一個查詢,顯示最新和最早的日期及其 sales_net_amt,但我不知道如何添加計算列以基於現有值

在此處輸入圖片說明

這是我所做的查詢(不需要 QUARTER 列並使查詢不必要地冗長,只是想我會暫時添加它,以防我最終使用它):

select case when extract(month from full_date) between 1 and 3 then substr(item_scan_timestamp, -4) || 'Q1'
     when extract(month from full_date) between 4 and 6 then substr(item_scan_timestamp, -4) || 'Q2'
     when extract(month from full_date) between 7 and 9 then substr(item_scan_timestamp, -4) || 'Q3'
     when extract(month from full_date) between 10 and 12 then substr(item_scan_timestamp, -4) || 'Q4' end quarter, r.store_id, p.full_date, r.sales_net_amt
from retailsalesfact r join purchasedate p on p.purchase_date_id = r.purchase_date_id
where (r.store_id, p.full_date) in (select r.store_id, max(p.full_date) full_date
        from retailsalesfact r join purchasedate p on p.purchase_date_id = r.purchase_date_id
        group by r.store_id)
union all
select case when extract(month from full_date) between 1 and 3 then substr(item_scan_timestamp, -4) || 'Q1'
     when extract(month from full_date) between 4 and 6 then substr(item_scan_timestamp, -4) || 'Q2'
     when extract(month from full_date) between 7 and 9 then substr(item_scan_timestamp, -4) || 'Q3'
     when extract(month from full_date) between 10 and 12 then substr(item_scan_timestamp, -4) || 'Q4' end quarter, r.store_id, p.full_date, r.sales_net_amt
from retailsalesfact r join purchasedate p on p.purchase_date_id = r.purchase_date_id
where (r.store_id, p.full_date) in (select r.store_id, min(p.full_date) full_date
        from retailsalesfact r join purchasedate p on p.purchase_date_id = r.purchase_date_id
        group by r.store_id)
order by store_id, full_date, sales_net_amt;

select store_id, full_date, sales_net_amt
from retailsalesfact r join purchasedate p on p.purchase_date_id = r.purchase_date_id
order by store_id;

任何建議表示贊賞。

您可以在GROUP BY使用KEEP子句,因為您希望每個商店有一條記錄,如下所示:

select store_id, 
       case when max(SALES_NET_AMT) keep (dense_rank first order by FULL_DATE desc) 
                  > max(SALES_NET_AMT) keep (dense_rank first order by FULL_DATE) 
            then 'Increased' 
            else 'Decreased' 
      end as result
  from your_Table t
group by store_id

假設您的FULL_DATE列實際上是一個日期,您可以使用FIRST_VALUELAST_VALUE按日期獲取第一個和最后一個值,然后比較它們:

SELECT DISTINCT STORE_ID,
       CASE WHEN LAST_VALUE(SALES_NET_AMT) OVER (PARTITION BY STORE_ID ORDER BY FULL_DATE) >
                 FIRST_VALUE(SALES_NET_AMT) OVER (PARTITION BY STORE_ID ORDER BY FULL_DATE) THEN 'Increased'
            ELSE 'Decreased'
       END AS SALES_CHANGE
FROM YourTable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM