繁体   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