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 选择除最近日期之外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章
编写 SQL 查询,选择除同时在三列中具有指定值的行之外的所有行
如何使用 MySQL 查询从表中选择除一列之外的所有内容? [复制]