[英]How to get earliest date from time parameter without including data that have data older than time parameter in SQL?
我正在为一种痛苦的问题苦苦挣扎一段时间。
我想要实现的是在下图中找到蓝色圆圈。 它是查找某个name
在数据库中首先出现的date
,但它是所有可能出现的最远日期(就start date parameter
和开始日期和数据之间所有可能的差距而言,距离最远)
我知道如何在开始日期之后找到日期。 为此,我正在使用该查询。
SELECT *
FROM animals
WHERE date(date) > '2020-01-01'
ORDER BY date ASC
LIMIT 1 ;
但我不知道如何在此查询中排除2020-01-01
之前发生的数据。
我想以 SQL 查询的形式进行。
我的 SQL 表如下所示:
日期 | 姓名 | 价值 |
---|---|---|
2022-02-01 | 狗 | 45.5 |
2022-02-01 | 猫 | 2.5 |
2022-02-01 | 蛇 | 2.5 |
2022-01-31 | 狗 | 42.5 |
2022-01-31 | 猫 | 3.4 |
2022-01-31 | 蛇 | 43.2 |
2022-01-30 | 狗 | 43.2 |
2022-01-30 | 猫 | 43.2 |
2022-01-30 | 蛇 | 43.2 |
2022-01-29 | 狗 | 43.2 |
2022-01-29 | 蛇 | 43.2 |
2022-01-28 | 狗 | 43.2 |
假设我正在寻找2022-01-28
之后的日期。 现在start_date
和 dog 的第一次出现之间的差距是 0 因为 dog 有2022-01-28
的数据。 蛇是 1 天( 2022-01-29
),猫是 2 天( 2022-01-30
)
所以我的结果应该是 2022-01-30(对于 cat 来说是 start_date 2 天),因为它离start_date
最远
搜索distinct on
,你会看到一些关于如何解决这个问题的解释。
这应该有效(我将日期字段更改为 event_date 以减少混乱)
with earliest_dates as (
select distinct on (name) name, event_date
from animals
where event_date > '2020-01-01'
order by name, event_date
)
select max(event_date) - min(event_date) as days
from earliest_dates;
sql 用于测试设置的小提琴链接http://sqlfiddle.com/#!15/67389/4/0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.