[英]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_VALUE
和LAST_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.