按最小和最大记录聚合定价数据的SQL

按最小和最大记录聚合定价数据的SQL,sql,rdbms,Sql,Rdbms,我有下面的示例数据集,其中我尝试按年份汇总多年航行的总价格 我想按年份汇总,包括2017年的航行日期和行程、最低航行日期/行程标准和2018年的最高航行日期/行程标准 所以最终会有两个记录: 这个问题不是关于汇总,而是关于每年挑选相关记录。您可以使用ROW_NUMBER()进行此操作(如果您的RDBMS(您没有标记您的问题)支持此操作) 诀窍是计算子查询中的两个行号,每个升序和降序段。然后,外部查询可以根据年份决定应该使用哪个查询: SELECT * FROM ( SELECT

我有下面的示例数据集,其中我尝试按年份汇总多年航行的总价格

我想按年份汇总,包括2017年的航行日期和行程、最低航行日期/行程标准和2018年的最高航行日期/行程标准

所以最终会有两个记录:


这个问题不是关于汇总,而是关于每年挑选相关记录。您可以使用
ROW_NUMBER()
进行此操作(如果您的RDBMS(您没有标记您的问题)支持此操作)

诀窍是计算子查询中的两个行号,每个升序和降序段。然后,外部查询可以根据年份决定应该使用哪个查询:

SELECT *
FROM (
    SELECT
        t.*,
        ROW_NUMBER() OVER(PARTITION BY season ORDER BY segment) rn_asc,
        ROW_NUMBER() OVER(PARTITION BY season ORDER BY segment DESC) rn_desc
    FROM mytable t
) x
WHERE
   (rn_asc = 1 AND season = 2017) 
   OR (rn_desc = 1 AND season = 2018)

我想这正是你想要的:

select t.*
from (select t.*,
             row_number() over (order by segment) as seqnum_asc,
             row_number() over (order by segment desc) as seqnum_desc,
             sum(totalprice) over (partition by season) as season_price
      from t
     ) t
where 1 in (seqnum_asc, seqnum_desc);
注意:这将返回基于
季节的第一条和最后一条记录,不考虑年份。出于某种原因,对我来说,这比选择一年中的第一个和明年的最后一个更有意义——这与你想要的结果是一致的