如何比较Oracle中一组行的最大和最小日期的列值?
How to compare the column values of the max and min dates of a group of rows in Oracle?
给定一个看起来像这样的 table,我将如何创建另一个获取此数据的查询,比较 sales_net_amt 的最早日期和最晚日期 store_id,并且 returns 每行 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;
感谢任何建议。
假设您的 FULL_DATE
列实际上是一个日期,您可以使用 FIRST_VALUE
and 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
您可以在 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
给定一个看起来像这样的 table,我将如何创建另一个获取此数据的查询,比较 sales_net_amt 的最早日期和最晚日期 store_id,并且 returns 每行 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;
感谢任何建议。
假设您的 FULL_DATE
列实际上是一个日期,您可以使用 FIRST_VALUE
and 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
您可以在 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