2016-12-30 48 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