【发布时间】:2009-03-13 18:01:25
【问题描述】:
一定有更好的方法来编写这个查询。
我想选择一对日期之间的所有数据。理想情况下,结果集的第一行和最后一行将是 WHERE 子句中指定的行。如果这些行不存在,我希望这些行在请求的范围之前和之后。
一个例子:
如果我的数据是:
...
135321, 20090311 10:15:00
135321, 20090311 10:45:00
135321, 20090311 11:00:00
135321, 20090311 11:15:00
135321, 20090311 11:30:00
135321, 20090311 12:30:00
...
查询是:
SELECT *
FROM data_bahf
WHERE param_id = 135321
AND datetime >= '20090311 10:30:00'
AND datetime <= '20090311 12:00:00'
我希望返回的数据包括 10:15 的行和 12:30 的行。不只是那些严格符合 WHERE 子句的人。
这是我想出的最好的。
SELECT * FROM (
SELECT *
FROM data_bahf
WHERE param_id = 135321
AND datetime > '20090311 10:30:00'
AND datetime < '20090311 12:00:00'
UNION
(
SELECT * FROM data_bahf
WHERE param_id = 135321
AND datetime <= '20090311 10:30:00'
ORDER BY datetime desc
LIMIT 1
)
UNION
(
SELECT * FROM data_bahf
WHERE param_id = 135321
AND datetime >= '20090311 12:00:00'
ORDER BY datetime asc
LIMIT 1
)
)
AS A
ORDER BY datetime
(暂时忽略 SELECT * 的使用)
编辑: 我在 param_id、datetime 和 (param_id, datetime) 上有索引
【问题讨论】:
-
您需要将 param_id 添加到 ORDER BY 子句中,以便使用 (param_id, datetime) 上的索引,如下所示: ORDER BY param_id, datetime; ORDER BY param_id DESC,日期时间 DESC
标签: sql postgresql union