Найти недостающие строки с помощью SQL - PullRequest
1 голос
/ 31 октября 2010

У меня есть таблица SQL как таковая

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

(1 rows)

И нужно сделать запрос так, чтобы строка Джона Смита возвращалась только тогда, когда число двигателей больше 2000

Ответы [ 5 ]

1 голос
/ 01 ноября 2010

Я бы попробовал запрос, подобный этому (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 голосов
/ 01 ноября 2010
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 веком короля).

0 голосов
/ 01 ноября 2010

Используйте 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 голосов
/ 01 ноября 2010

Не знаю, работает ли этот синтаксис в mysql, но я использую его в tsql.

Используйте код, который вы написали, чтобы получить конечные годы, которых нет в столбце начала, и наоборот

и добавьте операторы where, такие как

, где start> (выберите top 1 start из таблицы в порядке старта)

и где stop <(выберите top 1 stop из таблицы в порядке остановки деск) </p>

0 голосов
/ 01 ноября 2010

Создайте таблицу с одним столбцом года и заполните его всеми действительными годами. Теперь присоединяйтесь, где год между началом и окончанием. Осталось еще немного поработать, но вы сможете получить его оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...