Список записей из последовательности в MySQL - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть простая таблица MySQL

+--------+------------+
| REFNUM | TSTAMP     |
+--------+------------+
| 1      | 2018-JUN-1 |
| 2      | 2018-JUN-3 |
| 3      | 2018-JAN-1 |
| 4      | 2018-JUN-4 |
| 5      | 2018-JUN-6 |
| 6      | 2018-JAN-2 |
+--------+------------+

И записи № 3 и 6 вне последовательности по дате. Я хотел бы запрос вернуть REFNUM 3 и 6 из моей таблицы. На основе похожих вопросов я построил запрос:

SELECT REFNUM FROM
(
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY REFNUM ORDER BY REFNUM  ) AS sequenceCorrect,
    ROW_NUMBER() OVER (PARTITION BY REFNUM ORDER BY TSTAMP) AS sequenceActual
  FROM queries
)
  AS yourTableSequenced
WHERE
  sequenceCorrect <> sequenceActual
ORDER BY REFNUM

но я всегда получаю пустой результат. Может кто-нибудь объяснить, почему и как исправить?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Как насчет этого простого запроса с подзапросом (при условии, что TSTAMP - это столбец DATE):

SELECT REFNUM
FROM queries AS outer_query
WHERE TSTAMP < (SELECT TSTAMP FROM queries WHERE REFNUM = outer_query.REFNUM-1);

Попробуйте ЗДЕСЬ .Надеюсь, это поможет.

0 голосов
/ 19 ноября 2018

Предполагая, что, возможно, могут быть промежутки между идентификаторами, проверяя, меньше ли текущий TSTAMP, чем предыдущий идентификатор TSTAMP:

SELECT *  FROM queries q WHERE 
    (q.TSTAMP < 
    (SELECT qq.TSTAMP FROM queries qq WHERE REFNUM = 
    (SELECT MAX(REFNUM) FROM queries WHERE REFNUM < q.REFNUM))) 
0 голосов
/ 19 ноября 2018

Вы делите на refnum, что представляется уникальным. Означает, что оба значения всегда 1.

SELECT q.*
FROM (SELECT q.*,
             ROW_NUMBER() OVER (ORDER BY REFNUM ) AS sequenceCorrect,
             ROW_NUMBER() OVER (ORDER BY TSTAMP) AS sequenceActual
      FROM queries q
     ) q
WHERE sequenceCorrect <> sequenceActual
ORDER BY REFNUM;

Вы также можете сделать это с помощью функции single window:

SELECT q.*
FROM (SELECT q.*,
             MAX(TSTAMP) OVER (ORDER BY REFNUM) as MAX_TSTAMP
      FROM queries q
     ) q
WHERE MAX_TSTAMP <> TSTAMP
ORDER BY REFNUM;

EDIT:

Если вы хотите, чтобы ордера поменялись местами, используйте lag():

SELECT q.*
FROM (SELECT q.*,
             LAG(TSTAMP) OVER (ORDER BY REFNUM) as PREV_TSTAMP
      FROM queries q
     ) q
WHERE PREV_TSTAMP > TSTAMP
ORDER BY REFNUM;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...