Sql 最小/最大时间戳,后跟特定日期
表包括以下内容:Sql 最小/最大时间戳,后跟特定日期,sql,teradata,minmax,Sql,Teradata,Minmax,表包括以下内容: +------+----------------+--------------------------------------+ | ID | Date | Timestamp | +------+----------------+--------------------------------------+ | 1 | 01-01-2020 | 01-01-2020 10:00:00
+------+----------------+--------------------------------------+
| ID | Date | Timestamp |
+------+----------------+--------------------------------------+
| 1 | 01-01-2020 | 01-01-2020 10:00:00 |
| 1 | 06-01-2020 | 06-01-2020 23:00:00 |
| 1 | 03-02-2020 | 03-02-2020 10:00:00 |
| 2 | 06-01-2020 | 06-01-2020 12:49:00 |
| 2 | 07-03-2020 | 07-03-2020 10:51:00 |
| 3 | 23-01-1992 | 23-01-1992 09:00:00 |
| 3 | 23-01-1992 | 23-01-1992 10:00:00 |
+------+----------------+--------------------------------------+
我想获得ID,最小时间戳日期为'06-01-2020',答案应该是ID 2
SELECT
ID,
MIN(Timestamp)
FROM Table
WHERE Date = '06-01-2020'
GROUP BY ID
我对上述内容的理解将首先过滤日期,然后再获取最小时间戳,这将给出ID 1和2的错误结果。请告知。首先尝试在整个表中查找最小值,然后限制到感兴趣的日期:
SELECT ID, min_timestamp
FROM
(
SELECT ID, MIN(Timestamp) AS min_timestamp
FROM yourTable
GROUP BY ID
) t
WHERE Date = '2020-06-01';
您似乎需要两个条件: 每个id的最小时间戳 在特定日期有记录的ID 您可以: 这将按id聚合并返回最小时间戳。然后它过滤ID,以便只过滤日期为2020-06-01的ID 如果“2020-06-01”是表中的最新日期,则可以将其简化为:
HAVING MAX(Date) = '2020-06-01'
这将在2020年1月6日返回具有最小时间戳的ID
SELECT
ID,
MIN(Timestamp)
FROM Table
GROUP BY ID
HAVING min(Date) = date '2020-01-06'
或者不带日期列
HAVING cast(min(timestamp as date)) = date '2020-01-06'
您能解释一下您的解决方案吗?@IcySkullz使用MIN的子查询对整个未过滤表进行查询,以查找绝对最早的时间戳。这独立于您的查询的其余部分,因此这绕过了在WHERE子句中仅筛选一个日期的问题。我可以知道最小时间戳是否与每个ID关联吗?您刚刚更改了问题。请让我们知道当前版本是否是最终编辑。是的,当前版本应该是最终编辑,我以前忘了包括GROUPBY。我不熟悉HAVING的工作原理。这是我对您的解决方案的理解:检索所有具有“2020-06-01”的ID,并获取这些ID的最早日期。如果我误解了,请更正我的错误。我已通过post编辑,以便更好地理解。请与您确认解决方案是否返回ID 2?谢谢。我试图想象拥有是如何运作的。如果我们使用GROUPBY并仅指示ID列,那么表中是否只剩下ID和聚合列?然后,系统将如何使用having?having过滤聚合结果,类似于从何处过滤聚合结果。它只能访问GroupBy和聚合列中的列,这就是为什么mindate可以工作,但没有date。
HAVING cast(min(timestamp as date)) = date '2020-01-06'