这可能已经被要求了,但StackOverflow是巨大的,试图谷歌的一些具体的东西,实际上是一个噩梦!
最后,我得到了一个相当大的SQL查询,我想知道这样做是否可以指出我可能遗漏的更简单的方法。
我有一个名为usage
的表,其结构如下:
host | character varying(32) |
usage | integer |
logtime | timestamp without time zone | default now()
我想得到最大和最小日志时间的使用值。在阅读了我的一些旧课本(我真正正确地使用SQL已经有一段时间了)之后,我最终得到了这个连接:
SELECT *
FROM (SELECT u.host,u.usage AS min_val,r2.min
FROM usage u
JOIN (SELECT host,min(logtime) FROM usage GROUP BY host) r2
ON u.host = r2.host AND u.logtime = r2.min) min_table
NATURAL JOIN (SELECT u.host,u.usage AS max_val,r1.max
FROM usage u
JOIN (SELECT host,max(logtime) FROM usage GROUP BY host) r1
ON u.host = r1.host AND u.logtime = r1.max) max_table
;
这似乎是一个很混乱的方法,因为我基本上运行同一个查询两次,一次使用MAX,一次使用m in。我可以通过执行
SELECT usage,MAX(logtime),MIN(logtime) FROM ...
在一个查询中同时获得两个logtime列,但是我不知道如何显示对应于两个不同记录的使用值。有什么想法吗?
最佳答案
使用PostgreSQL 9.1,您可以随意使用窗口函数(8.4+):
SELECT DISTINCT
u.host
,first_value(usage) OVER w AS first_usage
,last_value(usage) OVER w AS last_usage
FROM usage u
WINDOW w AS (PARTITION BY host ORDER BY logtime, usage
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
我按
logtime
和usage
对分区进行排序,除此之外,还断开任何连接并得出稳定的结果。阅读window functions in the manual。有关更多说明和链接,您可能需要参考最近的相关答案here或here。
关于sql - SQL-在两个结果表上进行联接,是否有重构的想法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8689061/