【问题标题】:Is it possible to to retrieve a top ROW_NUMBER() for each group without a sub-query?是否可以在没有子查询的情况下为每个组检索顶部 ROW_NUMBER()?
【发布时间】:2021-02-07 00:40:41
【问题描述】:

本着简洁美观的编码精神,我想知道是否有人能够创建一个完全如下执行的查询,但没有子查询

查询示例:

本质上,子查询是通过首先对每个患者的每一行进行排序和标记来检索每个用户的最近日期,其中“1”是每个患者的最近日期。然后,外部查询识别并返回每个“1”,即与每个用户关联的最大日期。

SELECT user_name
      ,date
FROM(
    SELECT user_name
          ,date
          ,row_number() OVER(PARTITION BY user_name ORDER BY date DESC) as row_num
    FROM yourtable
) AS t
WHERE t.row_num = 1

数据示例预执行:

|user_name|date |
|Some1    |10/22|
|Some1    |10/27|
|Some1    |10/30|
|Some2    |10/30|
|Some2    |11/15|
|Some2    |11/18|

执行后数据示例:

|user_name|date |
|Some1    |10/30|
|Some2    |11/18|

准备让你们大吃一惊

【问题讨论】:

  • 你为什么特别想避免子查询?替代品可能表现不佳。

标签: sql sql-server greatest-n-per-group


【解决方案1】:

您可以使用WITH TIES 选项

Select top 1 with ties *
 From  yourtable
 Order By row_number() OVER(PARTITION BY user_name ORDER BY date DESC) 

【讨论】:

    【解决方案2】:

    对于您的示例,您可以使用group by:

    select user_name, max(date)
    from t
    group by user_name;
    

    【讨论】:

    • 我很欣赏这种方法的简单性和效率
    【解决方案3】:

    您可以使用SELECT DISTINCTLAST_VALUEMAX() OVER 的组合(指定ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)。像这样的

    数据

    drop table if exists #tTable;
    go
    create table #tTable(
      user_name     varchar(100) not null,
      dt            date not null);
     
     Insert into #tTable values
    ('Some1', '20201022'),
    ('Some1', '20201027'),
    ('Some1', '20201030'),
    ('Some2', '20201030'),
    ('Some2', '20201115'),
    ('Some2', '20201118');
    

    查询

    select distinct last_value(user_name) over (partition by user_name order by dt) as user_name,
                    max(dt) over (partition by user_name order by dt 
                                  rows between unbounded preceding
                                       and unbounded following) as [date]
    from #tTable;
    

    输出

    user_name   date
    Some1       2020-10-30
    Some2       2020-11-18
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 2019-12-17
      相关资源
      最近更新 更多