SQL 选择除最近日期之外的所有内容

Posted

技术标签:

【中文标题】SQL 选择除最近日期之外的所有内容【英文标题】:SQL Select everything besides the most recent date 【发布时间】: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

【问题讨论】:

【参考方案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 分组的原因。但我知道我的问题没有得到很好的解释 谢谢老兄,一旦我测试它就会回复你 我只是用输入和预期结果编辑我的问题,希望现在更有意义

以上是关于SQL 选择除最近日期之外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

选择除 $(this) 之外的所有内容

编写 SQL 查询,选择除同时在三列中具有指定值的行之外的所有行

如何使用 MySQL 查询从表中选择除一列之外的所有内容? [复制]

通过 :not 在 jQuery 选择器中隐藏除 $(this) 之外的所有内容

如何使用正则表达式选择除捕获组之外的所有内容?

您可以选择除 1 或 2 个字段之外的所有内容,而不会出现作家抽筋吗?