2010-10-31 394 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世纪的国王)。