我有一张看起来像这样的表:
timestamp value person
===============================================
2010-01-12 00:00:00 33 emp1
2010-01-12 11:00:00 22 emp1
2010-01-12 09:00:00 16 emp2
2010-01-12 08:00:00 16 emp2
2010-01-12 12:12:00 45 emp3
2010-01-12 13:44:00 64 emp4
2010-01-12 06:00:00 33 emp1
2010-01-12 15:00:00 12 emp5
我想找到与每个人相关的最大值。显而易见的问题是:
select person,max(value) from table group by person
现在我想要包含与每个max(值)相关联的时间戳。我无法在上面的查询中使用timestamp列,因为众所周知,它不会出现在group by子句中。所以我写了这个:
select x.timestamp,x.value,x.person from table as x,
(select person,max(value) as maxvalue from table group by person order by maxvalue
desc) as y
where x.person = y.person
and x.value = y.maxvalue
这在某种程度上有效。我现在看到:
timestamp value person
===============================================
2010-01-12 13:44:00 64 emp4
2010-01-12 12:12:00 45 emp3
2010-01-12 06:00:00 33 emp1
2010-01-12 00:00:00 33 emp1
2010-01-12 08:00:00 16 emp2
2010-01-12 09:00:00 16 emp2
2010-01-12 15:00:00 12 emp5
问题是现在我得到了emp1和emp2的所有条目,最终以相同的max(值)结束。
假设在emp1和emp2中,我只想看到带有最新时间戳的条目。我想要这个:
timestamp value person
===============================================
2010-01-12 13:44:00 64 emp4
2010-01-12 12:12:00 45 emp3
2010-01-12 06:00:00 33 emp1
2010-01-12 09:00:00 16 emp2
2010-01-12 15:00:00 12 emp5
我必须写什么样的查询?是否有可能扩展我编写的嵌套查询以实现我想要的或者是否必须从头开始重写所有内容?
如果它很重要,因为我使用的是Sqlite,时间戳实际上存储为julian天。我使用datetime()函数将它们转换回每个查询中的字符串表示。
答案 0 :(得分:1)
你快到了那里:
SELECT max(x.timestamp) AS timestamp, x.value, x.person
, y.max_value, y.ct_value, y.avg_value
FROM table AS x
JOIN (
SELECT person
, max(value) as max_value
, count(value) as ct_value
, avg(value) as avg_value
FROM table
GROUP BY person
) AS y ON (x.person, x.value) = (y.person, y.max_value)
GROUP BY x.person, x.value, y.max_value, y.ct_value, y.avg_value
-- ORDER BY x.person, x.value
您无法在同一嵌套查询中计算max(x.timestamp)
,因为您不希望每个人的绝对最大值,而是一个伴随最大值的绝对最大值。因此,您必须在下一个查询级别聚合另一个时间。
在将其转换为字符串表示形式之前计算max(x.timestamp)
- 尽管您的格式也会正确排序。但那应该表现得更好。
注意我是如何使用(简化)连接条件将[cross]连接的条件转换为交叉连接的。是一样的,更像是SQL标准的规范方式,更具可读性。
所有这些都可以在一个查询级别中使用窗口函数(max()
和first_value()
)完成,这些函数在所有较大的RDBMS(MYSQL除外)中实现,但不在SQLite中实现。
在评论请求后包含其他聚合。