从通过GROUP BY获得的数据子集中选择MIN

时间:2019-03-25 10:40:38

标签: sql ms-access select group-by

有一个包含每小时时间序列数据的数据库,其中DB中的每一行代表一个小时。示例:

TIMESERIES TABLE

id     date_and_time        entry_category
1      2017/01/20 12:00     type_1
2      2017/01/20 13:00     type_1
3      2017/01/20 12:00     type_2
4      2017/01/20 12:00     type_3

首先,我使用GROUP BY语句查找每种输入类别的最新日期和时间:

SELECT MAX(date_and_time), entry_category
FROM timeseries_table
GROUP BY entry_category;

但是现在,我想在上面列出的查询中获得的datetime中找到哪个日期和时间是最近的时间。我将需要以某种方式使用SELECT MIN(date_and_time),但是如何让SQL知道我想将先前查询的输出视为“新表”以对其应用新的SELECT查询?我的总查询的输出应该是一个值-如果是上面显示的示例,date_and_time = 2017/01/20 12:00

我尝试使用别名,但似乎无法做到这一点,它们仅重命名现有的列或表(或者我正在滥用它们。。)那里有很多问题试图列出我已经达到的特定组(例如https://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/Select max value of each group)的MAX或MIN,但是现在我要在获取的日期时间列表上进行工作。我的数据库结构非常简单,但是我缺乏将这些查询串在一起的知识。

谢谢,加油!

2 个答案:

答案 0 :(得分:0)

这是您想要的吗?

SELECT TOP 1 MAX(date_and_time), entry_category
FROM timeseries_table
GROUP BY entry_category
ORDER BY MAX(date_and_time) ASC;

这将返回领带。如果您不想打结,请添加一个附加的排序键:

SELECT TOP 1 MAX(date_and_time), entry_category
FROM timeseries_table
GROUP BY entry_category
ORDER BY MAX(date_and_time) ASC, entry_category;

答案 1 :(得分:0)

您可以将第一个查询用作子查询,这与您将第一个查询的输出用作第二个查询的输入所描述的内容类似。在这里,您将根据需要从日期的第一行中取出一行。

SELECT MIN(date_and_time)
FROM (SELECT MAX(date_and_time) as date_and_time, entry_category
FROM timeseries_table
GROUP BY entry_category)a;