2010-10-31 391 views
1

我有一個SQL表作爲這樣查找使用SQL

  name   | engins| frank 
---------------------------+-------+------ 
John Smith     | 8422| 854 

(1 rows) 

,需要進行查詢,以便只返回行約翰·史密斯當ENGINS超過2000

+1

請不要刪除回答問題的文本:這樣可以防止其他人看到問題。相反,選擇最佳答案並將其標記爲已接受。 – Quassnoi 2010-10-31 23:32:04

回答

0

與創建一個表中缺少的行一列一年,並填寫所有有效年份。現在加入開始和結束之間的一年。還剩下一點工作,但你應該能夠從那裏得到它。

1

我想嘗試像這樣(的PostgreSQL 8.4+)查詢

WITH TT AS (
    SELECT start, stop, LAG(stop) OVER(ORDER BY stop ASC) AS lastStop 
    FROM yourtable 
) 
SELECT lastStop as start, start as stop 
FROM TT 
WHERE lastStop <> start; 

LAG()選擇從先前行的值。

+0

這工作完美!,但它會工作在我的表中的任何數據? – Spawn 2010-10-31 21:58:44

0

不知道這個語法是否適用於mysql,但我在tsql中使用它。

使用代碼你寫拿到停止多年不在開始列,反之亦然

,並添加在那裏同樣

條款的地方開始>(選擇從表順序頂部1日開始啓動)

,並在那裏停止<(選擇表的順序頂部1個停止的停止DESC)

0

使用FULL OUTER JOIN,這樣的事情:

SELECT 
* 
FROM 
yourtable AS a 
    FULL OUTER JOIN yourtable AS b ON a.stop = b.start 
WHERE 
    a.stop IS NULL 
OR 
    b.start IS NULL 
+0

如果數據中不存在日期/年份,則此查詢不會顯示它們 – 2010-10-31 21:31:48

+0

它找到了差距。 – 2010-10-31 21:51:04

0
SELECT * 
FROM (
     SELECT *, LAG(stop) OVER (ORDER BY start) AS start_anarchy, start AS stop_anarchy 
     FROM (
       SELECT * 
       FROM reigns 
       UNION ALL 
       VALUES (NULL::INTEGER, NULL::INTEGER) 
       ) q 
     ) q 
WHERE start_anarchy IS DISTINCT FROM stop_anarchy 

這也將第一標尺來之前,最後一個後顯示。

從原始表再次聲明,我試圖讓一個輸出表在那裏我將有幾百年的第一列和第二列在那個世紀負責所有的人的平均時間。

SELECT TRUNC(start - 1, -2) AS century, AVG(stop - start) AS avg_reign 
FROM q 
GROUP BY 
     TRUNC(start - 1, -2) 

的百年根據統治的開始計算,00年是最後一年上個世紀的(例如Constantine II將是一個IX世紀的國王)。