使用SQL查找缺少的行

时间:2010-10-31 20:59:56

标签: sql mysql postgresql

我有一个SQL表

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

(1 rows)

并且需要进行查询,以便在engins超过2000时仅返回行john smith

5 个答案:

答案 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()选择上一行的值。

答案 1 :(得分:0)

创建一个包含一年列的表格,并使用所有有效年份填充该表格。现在加入开始和停止之间的年份。还有一点工作要做,但你应该可以从那里得到它。

答案 2 :(得分:0)

不知道这个语法是否在mysql中有效,但我在tsql中使用它。

使用您编写的代码获取不在开始列中的停止年份,反之亦然

并添加

之类的where子句

其中start&gt; (选择前1名从表开始按顺序开始)

并且停止&lt; (通过停止desc从表顺序中选择前1名停止)

答案 3 :(得分: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

答案 4 :(得分: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世纪之王。