SQL Server: убедитесь, что два столбца находятся в одинаковом порядке сортировки - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть таблица с идентификатором и столбцом даты.Возможно (вероятно), что при создании новой записи она получает следующий больший идентификатор и текущую дату / время.Так что, если бы я сортировал по дате или по ID, результирующий набор данных был бы в том же порядке.

Как мне написать запрос SQL для проверки этого?

Также возможно, что старая запись будет изменена, а дата обновлена.В этом случае записи не будут в том же порядке сортировки.Я не думаю, что это происходит.

Я пытаюсь переместить данные в другое место, и если я знаю, что нет измененных записей, это делает это намного проще.

Я почти уверен, что мне нужно запросить только эти два столбца: ID, RecordDate.Другие ссылки указывают, что я должен иметь возможность использовать LAG, но я получаю сообщение об ошибке, что это не имя встроенной функции.

Другими словами, https://dba.stackexchange.com/questions/42985/running-total-to-the-previous-row и Есть ли способ получить доступ к значению «предыдущая строка» в операторе SELECT? должно помочь, но я все еще не могу заставить это работать для того, что я хочу.

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Один метод использует оконные функции:

select count(*)
from (select t.*,
             row_number() over (order by id) as seqnum_id,
             row_number() over (order by date, id) as seqnum_date
      from t
     ) t
where seqnum_id <> seqnum_date;

Когда счетчик равен нулю, тогда два столбца имеют одинаковый порядок.Обратите внимание, что второй order by включает id.Две строки могут иметь одинаковую дату.Это делает сортировку стабильной, поэтому сравнение допустимо, даже если в date есть дубликаты.

0 голосов
/ 20 декабря 2018

Если вы не можете использовать оконные функции, вы можете использовать коррелированный подзапрос и EXISTS.

SELECT *
       FROM elbat t1
       WHERE EXISTS (SELECT *
                            FROM elbat t2
                            WHERE t2.id < t1.id
                                  AND t2.recorddate > t1.recorddate);

Он выберет все записи, в которых существует другая запись с меньшим идентификатором и большей отметкой времени.Если результат пустой, вы знаете, что такой записи не существует, и данные выглядят так, как будто вы хотите, чтобы они были.

Может быть, вы хотите ограничить его немного больше, используя t2.recorddate >= t1.recorddate вместо t2.recorddate > t1.recorddate.Я не уверен, как ты этого хочешь.

0 голосов
/ 20 декабря 2018

все вышеприведенные решения хороши, но если даты и идентификаторы увеличиваются, это также должно работать

select  modifiedid=t2.id from 
yourtable t1 join yourtable t2
on t1.id=t2.id+1 and t1.recordDate<t2.recordDate
0 голосов
/ 20 декабря 2018

Используйте это:

SELECT ID, RecordDate FROM tablename t
WHERE 
  (SELECT COUNT(*) FROM tablename WHERE tablename.ID < t.ID) 
  <> 
  (SELECT COUNT(*) FROM tablename WHERE tablename.RecordDate < t.RecordDate); 

Подсчитывает для каждой строки, сколько строк на id меньше, чем id строки исколько строк имеют RecordDate меньше, чем RecordDate.Если эти счетчики не равны, он выводит эту строку.Результатом являются все строки, которые не будут находиться в одинаковом положении после сортировки по ID и RecordDate

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