Преобразовать этот SQL запрос в ANSI SQL - PullRequest
0 голосов
/ 26 января 2020

Я хотел бы преобразовать этот SQL запрос в ANSI SQL. У меня возникают проблемы, когда я оборачиваюсь вокруг логики c этого запроса.

Я использую хранилище данных Snowflake, но он не понимает этот запрос из-за оператора 'delete' перед соединением, поэтому я пытаясь сломать это. Насколько я понимаю, столбец с номером строки дает мне порядок от 1 до N на основе метки времени и помещает его в C. Затем C объединяется против себя в строках, отличных от первой строки (на основе идентификатора), и помещается в C1. Затем C1 удаляется из общих данных, что оставляет только первую строку.

Возможно, я неправильно понимаю logi c, но я не привык видеть выражение 'delete' прямо перед соединением. Дайте мне знать, если я правильно понял логи c, или направьте меня в правильном направлении.

Этот запрос был скопирован / вставлен из ЭТОГО stackoverflow вопроса, в котором есть точная ситуация, в которой я нахожусь пытаюсь решить, но в гораздо большем масштабе.

with C as
(
  select ID,
         row_number() over(order by DT) as rn
  from YourTable
)
delete C1
from C as C1
  inner join C as C2
    on C1.rn = C2.rn-1 and
       C1.ID = C2.ID

Специфическая c проблема, которую я пытаюсь решить, заключается в следующем. Давайте предположим, что у меня есть эта таблица. Мне нужно разделить строки по комбинациям первичных ключей (primKey 1 и 2), сохраняя при этом порядок отметок времени.

ID      primKey1  primKey2  checkVar1   checkVar2   theTimestamp 
100     1         2         302         423         2001-07-13
101     3         6         506         236         2005-10-25
100     1         2         302         423         2002-08-15
101     3         6         506         236         2008-12-05
101     3         6         300         100         2010-06-10
100     1         2         407         309         2005-09-05
100     1         2         302         423         2012-05-09
100     1         2         302         423         2003-07-24

После того, как строки разбиты и отметка времени упорядочена в каждом разделе, мне нужно удалить дубликат Комбинация checkVar (checkVar 1 & 2) строки до следующего изменения. Таким образом, оставив меня с самой ранней уникальной строкой. Строки со звездочками - те, которые необходимо удалить, поскольку они являются дубликатами.

ID      primKey1  primKey2  checkVar1   checkVar2   theTimestamp 
100     1         2         302         423         2001-07-13
*100    1         2         302         423         2002-08-15
*100    1         2         302         423         2003-07-24
100     1         2         407         309         2005-09-05
100     1         2         302         423         2012-05-09

101     3         6         506         236         2005-10-25
*101    3         6         506         236         2008-12-05
101     3         6         300         100         2010-06-10

Это окончательный результат. Как вы можете видеть для ID = 100, даже если 1-я и 3-я записи одинаковы, комбинация checkVar изменилась между ними, что нормально. Я только удаляю дубликаты, пока значения не изменятся.

ID      primKey1  primKey2  checkVar1   checkVar2   theTimestamp 
100     1         2         302         423         2001-07-13
100     1         2         407         309         2005-09-05
100     1         2         302         423         2012-05-09

101     3         6         506         236         2005-10-25
101     3         6         300         100         2010-06-10

1 Ответ

0 голосов
/ 26 января 2020

Если вы хотите сохранить самую раннюю строку для каждого id, то вы можете использовать:

delete from yourtable yt
    where yt.dt > (select min(yt2.dt)
                   from yourtable yt
                   where yt2.id = yd.id
                  );

Ваш запрос не будет делать этого, если это ваше намерение.

...