这可能已经被要求了,但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)

我按logtimeusage对分区进行排序,除此之外,还断开任何连接并得出稳定的结果。阅读window functions in the manual
有关更多说明和链接,您可能需要参考最近的相关答案herehere

关于sql - SQL-在两个结果表上进行联接,是否有重构的想法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8689061/

10-10 20:15