Написание сценария SQL, но возникли проблемы - PullRequest
3 голосов
/ 02 декабря 2011

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

В основном у меня есть таблица с именем image. В изображении есть столбец для основного идентификатора, вторичного идентификатора, типа, года и даты.

Основной идентификатор может иметь несколько дополнительных идентификаторов, что означает наличие нескольких строк одного и того же основного идентификатора с разными дополнительными идентификаторами. Каждый вторичный идентификатор наверняка будет иметь две строки: тип small и тип large. Некоторые из вторичных идентификаторов имеют повторяющиеся данные, поэтому может быть 6 строк (выбрано произвольное число), что означает, что один и тот же тип маленького и большого повторяется 3 раза для одного вторичного идентификатора для одного основного идентификатора. Все это может быть на один год, а затем повторяться на следующий год.

Это трудно понять, поэтому позвольте мне создать наглядный пример некоторых данных. Я плохо разбираюсь в форматировании, поэтому порядок строк данных будет таким, как я его напечатал выше: основной идентификатор, дополнительный идентификатор, тип, год и дата.

EX:

1000 3000 Small 2010 2010-11-28
1000 3000 Large 2010 2010-11-28
1000 3000 Small 2010 2010-11-29
1000 3000 Large 2010 2010-11-29
1000 3000 Small 2011 2010-11-30
1000 3000 Large 2011 2010-11-30

1000 3001 Small 2010 2010-11-28
1000 3001 Large 2010 2010-11-28
1000 3001 Small 2010 2010-11-28
1000 3001 Large 2010 2010-11-28
1000 3001 Small 2011 2010-11-28
1000 3001 Large 2011 2010-11-28

Вы можете видеть, что могут быть повторяющиеся данные для одного дополнительного идентификатора с одинаковыми датой и годом. Существуют также данные, которые могут дублироваться на основе одного и того же вторичного идентификатора и года, даже если дата выходной или просто другая.

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

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

Так, например, я ожидаю, что эти записи останутся после запуска этого скрипта:

1000 3000 Small 2010 2010-11-29
1000 3000 Large 2010 2010-11-29
1000 3000 Small 2011 2010-11-30
1000 3000 Large 2011 2010-11-30

1000 3001 Small 2010 2010-11-28
1000 3001 Large 2010 2010-11-28
1000 3001 Small 2011 2010-11-28
1000 3001 Large 2011 2010-11-28

Опять же, это только пример для одного основного идентификатора и пары вторичных идентификаторов, в этой таблице может быть х число основных идентификаторов.

Как мне написать запрос, который удалит лишние строки в этой таблице изображений, как определено в моем примере?

1 Ответ

3 голосов
/ 02 декабря 2011
WITH cteRowNums AS (
    SELECT MainId, SecondaryId, Type, Year, DateColumn,
           ROW_NUMBER() OVER(PARTITION BY MainId, SecondaryId, Type, Year ORDER BY DateColumn DESC) AS RowNum
        FROM image
)
DELETE FROM cteRowNums
    WHERE RowNum <> 1;
...