我意识到数据库查询返回了意外的结果,这是由于我不正确地使用了“ DISTINCT ON”和“ GROUP BY”
我希望有人能使我对此有所了解。实际的查询非常复杂,因此我将其简化:
我有一个由object_id和时间戳组成的表/内部查询:
CREATE TABLE test_select ( object_id INT , event_timestamp timestamp );
COPY test_select (object_id , event_timestamp) FROM stdin (DELIMITER '|');
1 | 2013-01-27 21:01:20
1 | 2012-06-28 14:36:26
1 | 2013-02-21 04:16:48
2 | 2012-06-27 19:53:05
2 | 2013-02-03 17:35:58
3 | 2012-06-14 20:17:00
3 | 2013-02-15 19:03:34
4 | 2012-06-13 13:59:47
4 | 2013-02-23 06:31:16
5 | 2012-07-03 01:45:56
5 | 2012-06-11 21:33:26
\.
我正在尝试选择一个不同的ID,按反向计时的时间戳排序/去重复
所以结果应该是[4,1,3,2,5]
我认为这可以满足我的需求(似乎):
SELECT object_id
FROM test_select
GROUP BY object_id
ORDER BY max(event_timestamp) DESC
;
出于测试/审核的目的,有时我想包括timestamp字段。我似乎无法弄清楚如何在该查询中包含另一个字段。
任何人都可以指出以上我的sql中明显的问题,或有关如何包括审核信息的建议吗?
为了能够选择所有列,而不仅是object_id
和MAX(event_timestamp)
,您可以使用DISTINCT ON
SELECT DISTINCT ON (object_id)
object_id, event_timestamp ---, more columns
FROM test_select
ORDER BY object_id, event_timestamp DESC ;
如果希望结果按event_timestamp DESC
而不是按进行排序object_id
,则需要将其包括在派生表或CTE中:
SELECT *
FROM
( SELECT DISTINCT ON (object_id)
object_id, event_timestamp ---, more columns
FROM test_select
ORDER BY object_id, event_timestamp DESC
) AS t
ORDER BY event_timestamp DESC ;
另外,您可以使用窗口功能,例如ROW_NUMBER()
:
WITH cte AS
( SELECT ROW_NUMBER() OVER (PARTITION BY object_id
ORDER BY event_timestamp DESC)
AS rn,
object_id, event_timestamp ---, more columns
FROM test_select
)
SELECT object_id, event_timestamp ---, more columns
FROM cte
WHERE rn = 1
ORDER BY event_timestamp DESC ;
或MAX()
与OVER
:
WITH cte AS
( SELECT MAX(event_timestamp) OVER (PARTITION BY object_id)
AS max_event_timestamp,
object_id, event_timestamp ---, more columns
FROM test_select
)
SELECT object_id, event_timestamp ---, more columns
FROM cte
WHERE event_timestamp = max_event_timestamp
ORDER BY event_timestamp DESC ;
主要内容:令人惊艳的英语自我介绍篇1,令人惊艳的英语自我介绍篇2,令人惊艳的英语自我介绍篇3,令人惊艳的英语自我介绍篇4,令人惊艳的英语自我介绍篇5,令人惊艳的英语自我介绍篇6,令人惊艳的英语自我介绍篇7,令人惊艳的英语自我介绍简短7篇 令人惊艳的英语自我介绍?我们在这之前就要知道:自我介绍要有论点和论据,不能只有论点而没有论据支撑。既然这样,那么下面小编给大家带来了令人惊艳的英语自我介绍7篇,供大家参考。 令人惊艳的英语自我介绍篇1 My name is ____. I'm 9 years o
问题内容: 在我的应用程序中,我遇到了以下问题,并对结果感到惊讶: (两个整数)。 这是什么意思? 问题答案: 对于实际值,即结果为。 您使用整数除法得到的结果将向下舍入为的更负值。(也称为“地板部门”) 这就是为什么您会得到以下令人困惑的答案的原因: 注: 这是在Python 3中,其中的结果,“固定”是。因此,如果您没有理由使用Python 2,则应该升级。;) 在Python 3中,如果仍然
主要内容:让人惊艳的英语自我介绍(篇1),让人惊艳的英语自我介绍(篇2),让人惊艳的英语自我介绍(篇3),让人惊艳的英语自我介绍(篇4),让人惊艳的英语自我介绍(篇5),让人惊艳的英语自我介绍(篇6),让人惊艳的英语自我介绍(篇7),让人惊艳的英语自我介绍7篇 让人惊艳的英语自我介绍?其实一份好的自我介绍是很容易写好的,只要你把自己优秀的那一面展现出来,把自己的基本信息讲清楚就可以了。下面小编给大家带来了让人惊艳的英语自我介绍,供大家参考。 让人惊艳的英语自我介绍(篇1) Dear teache
谁能解释一下吗?
问题内容: 我在timeit上获得了非常令人惊讶的结果,有人可以告诉我我做错了什么吗?我正在使用Python 2.7。 这是文件speedtest_init.py的内容: 这些是speedtest.py的内容: 控制台输出为: 我认为默认情况下timeit()运行代码的1000000倍,因此我需要将时间除以1000000,但是令人惊讶的是Counter的速度比defaultdict()慢。 那是预