【问题标题】:SQL Select everything besides the most recent dateSQL 选择除最近日期之外的所有内容
【发布时间】:2021-01-25 07:34:09
【问题描述】:

我有一张表,我想在其中提取除最近日期之外的所有日期。我尝试了以下方法,但它给了我一个错误“聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中”

这是我尝试过的:

SELECT 
groupId, 
Types,
MAX(Dates) as date

FROM TableData

Where Dates < Max(dates)

GROUP BY 
groupId, 
Types

//The table looks as follows:
ID      |   GroupID | Date
1       |     A     | 10-10-2020 -> don't show
2       |     A     | 09-10-2020
3       |     A     | 08-10-2020
4       |     B     | 10-10-2020 -> don't show
5       |     B     | 09-10-2020
6       |     B     | 08-10-2020


//Expected result:
GroupID | Date
  A     | 09-10-2020
  A     | 08-10-2020
  B     | 09-10-2020
  B     | 08-10-2020

【问题讨论】:

    标签: sql sql-server subquery greatest-n-per-group window-functions


    【解决方案1】:

    你也可以使用DENSE_RANK

    select max_cte as (
        select *, dense_rank() over (parition by id order by [dates] desc) max_rnk
        from TableData)
    select Id, [Types], MAX(Dates) as [date]
    from max_cte 
    where max_rnk>1
    group by Id, [Types];
    

    【讨论】:

      【解决方案2】:

      如果您希望表中的所有行都包含日期与表中最新日期匹配的行,则一个选项使用子查询:

      select t.*
      from tabledata t
      where date < (select max(date) from tabledata)
      

      你也可以用窗口函数来表达这一点(但不一定表现得更好):

      select *
      from (select t.*, max(date) over() max_date from tabledata t) t
      where date < max_date
      

      编辑:如果您希望基于每个id 的逻辑,那么我们需要关联子查询:

      select t.*
      from tabledata t
      where date < (select max(t1.date) from tabledata t1 where t1.id = t.id)
      

      ...或者在窗口max()中使用partition by子句:

      select *
      from (select t.*, max(date) over(partition by id) max_date from tabledata t) t
      where date < max_date
      

      【讨论】:

      • Hi GMB 关于子查询唯一让我感到困惑的是,如果子查询日期获取整个表数据还是仅获取匹配的 id?
      • @MishMish:这是整个表格中的最大日期。但它可以很容易地调整以适应另一种情况,如果这是你想要的(尽管这不是你所要求的)。
      • 是的,这就是我想要的,这就是我按 ID 分组的原因。但我知道我的问题没有得到很好的解释
      • 谢谢老兄,一旦我测试它就会回复你
      • 我只是用输入和预期结果编辑我的问题,希望现在更有意义
      猜你喜欢
      • 1970-01-01
      • 2016-01-11
      • 2015-06-21
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2011-10-24
      相关资源
      最近更新 更多