gpt4 book ai didi

SQL - 在两个结果表上加入,重构的想法?

转载 作者:行者123 更新时间:2023-11-29 12:06:32 25 4
gpt4 key购买 nike

这可能已经有人问过,但 StackOverflow 非常庞大,试图通过谷歌搜索一些足够具体的东西来实际提供帮助是一场噩梦!

我结束了一个相当大的 SQL 查询,想知道 SO 是否可以指出我可能错过的更简单的方法。

我有一个名为 usage 的表,其结构如下:

host    | character varying(32)       | 
usage | integer |
logtime | timestamp without time zone | default now()

我想获取 MAX 和 MIN 日志时间的使用值。在阅读了我的一些旧教科书之后(自从我真正正确使用 SQL 以来已经有一段时间了),我最终得到了这个 JOIN:

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,一次使用 MIN。我可以通过 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 - 在两个结果表上加入,重构的想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com