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'