2016-12-30 50 views
0

我有如下表(项目)SQL获得项目和明年关闭项目

iteminfo, timestamp_start, timestamp_stop 

我需要根据时间戳来选择一个项目:

SELECT * 
FROM items 
WHERE timestamp_start <= '2016-12-27T03:00:00' 
    AND timestamp_stop >= '2016-12-27T04:00:00' 

现在我还需要以获得下一个最近的项目(即,具有大于所选项目的timestamp_stoptimestamp_start)。

+2

您可能需要一些示例数据和预期的结果,除了展现给你已经尝试过。 – mustaccio

回答

1

您可以使用row_number来做到这一点(获取下一个项目)。我已经把它作为一个CTE来分清楚,但这些可以合并为子查询。

WITH item_rn AS 
( -- add a row number based on what we care about getting next (timestamp_start) 
    SELECT *, 
     ROW_NUMBER() OVER (ORDER BY timestamp_start) as RN 
    FROM items 
), list_in_range AS 
(-- get our base list 
    SELECT * 
    FROM item_rn 
    WHERE timestamp_start <= '2016-12-27T03:00:00' AND timestamp_stop >= '2016-12-27T04:00:00' 
), next_item AS 
(-- get the next item 
    SELECT * 
    FROM item_rn 
    WHERE rn = (SELECT MAX(rn) FROM list_in_range) + 1 
) -- combine lists for final result. 
SELECT * 
FROM list_in_range 

UNION ALL 

SELECT * 
FROM next_item 
0

我不确定您的意思是“下一个最近的项目”。如果你想下一个项目的ID,使用lead()

SELECT i.* 
FROM (SELECT i.*, LEAD(i.item_id) OVER (ORDER BY timestamp_start) as next_item_id 
     FROM items i 
    ) i 
WHERE timestamp_start <= '2016-12-27T03:00:00' AND 
     timestamp_stop >= '2016-12-27T04:00:00'; 

作为一个说明:

SELECT i.* 
FROM (SELECT i.*, LEAD(i) OVER (ORDER BY timestamp_start) as next_item 
     FROM items i 
    ) i 
WHERE timestamp_start <= '2016-12-27T03:00:00' AND 
     timestamp_stop >= '2016-12-27T04:00:00'; 

使用表别名指:您可以通过引用表中获取的整个记录除非你在Postgres中相当先进,所以我更喜欢用独特的id来思考。

+0

他意味着行不是id。在这个问题中什么也没有,甚至建议一个item_id列存在....看起来你在这个假期是懒惰的。 :) – Hogan

+0

@霍根。 。 。我修改了答案并解释了为什么“发明”它。没有样本数据和期望的结果,这个问题对于需要做什么并不是特别清楚。 –

+0

哇这真的有效? LEAD()在表名上?我从来没有见过 - 只能是progresql。 – Hogan

-1

我想我找到了一个简单的解决方案:

SELECT * 
     FROM items 
     WHERE timestamp_start <= '2016-12-27T04:00:00' 
      AND timestamp_stop >= '2016-12-27T04:00:00' 
UNION 
SELECT * 
     FROM items 
     WHERE timestamp_start> '2016-12-27T04:00:00' 
ORDER BY timestamp_start LIMIT 2 
+0

这不会工作 - 你不知道第一个项目更大的时间戳下一个项目。下一个项目可能是<='2016-12-27T04:00:00'但没有停止> ='2016-12-27T04:00:00' – Hogan

+0

怎么可能是<='2016-12-27T04: 00:00'? WHERE子句(WHERE start>'2016-12-27T04:00:00')应该防止这种情况发生。 – Chris

+0

他们是两个不同的列 - 你真的需要示例数据,哪里失败?? – Hogan