【问题标题】:selecting the first and the last row of partition orderd by date按日期选择分区顺序的第一行和最后一行
【发布时间】:2019-11-06 13:40:57
【问题描述】:

嗨,你有一个看起来像这样的数据集

我需要编写一个查询来返回每个人选择的第一个和最后一个颜色。 这是我的代码

    Select t1.name,t1.color,min(t1.rnkmin) ,t2.color,max(t2.rnkmax) 
    From(
   Select name,color,
  Danse_rank() over(partition by name order by time asc) as rnkmin 
  From table 3) as t1 inner join (
 Select name,color,
 Danse_rank() over (partition by name order by date asc) as rnkmax 
  From table 3) as t2 on t1.name=t2.name 

但遗憾的是我得到了一个错误,我不明白为什么 谢谢你的帮助:)

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql pivot greatest-n-per-group window-functions


【解决方案1】:

你可以使用row_number()两次:

select color, name, time
from (
    select
        t.*,
        row_number() over(partition by name order by time) rn_asc,
        row_number() over(partition by name order by time desc) rn_desc
    from mytable t
) t
where rn_asc = 1 or rn_desc = 1

如果您希望两种颜色在同一条记录中,则可以聚合:

select 
    name, 
    max(case when rn_asc = 1 then color end) as first_color
    max(case when rn_desc = 1 then color end) as last_color
from (
    select
        t.*,
        row_number() over(partition by name order by time) rn_asc,
        row_number() over(partition by name order by time desc) rn_desc
    from mytable t
) t
where rn_asc = 1 or rn_desc = 1
group by name

【讨论】:

    【解决方案2】:

    在许多数据库中,最快的方法将使用相关子查询:

    select t.*
    from t
    where t.time = (select min(t2.time)
                    from t t2
                    where t2.name = t.name
                   ) or
          t.time = (select max(t2.time)
                    from t t2
                    where t2.name = t.name 
                   ) ;
    

    您希望在(name, time) 上建立索引。

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 2015-10-10
      • 2020-12-28
      • 2016-04-08
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多