sql select query удалить строки путем сравнения дат

Мне нужно написать запрос выбора sql для таблицы, но у меня есть 1 особое условие, с которым у меня проблема. Моя структура таблицы выглядит следующим образом:

ID       Name         Serial      CreatedOn
1         A            1000         2014-10-10
2         A            1000         2014-10-12
3         A            1000         2014-12-12
4         B            1023         2014-10-01

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

Как я могу написать этот запрос на выборку?

Спасибо,


person Erfan Zarger    schedule 29.10.2014    source источник
comment
это оракул или ms sql или mysql?   -  person radar    schedule 29.10.2014


Ответы (2)


вы можете сделать это с помощью UNION, где вы всегда можете получать данные за 1 месяц, а во втором выборе вы можете удалить дубликаты, используя row_number

Синтаксис основан на MS SQL, если это другая СУБД, то функции даты нужно модифицировать.

SELECT ID,Name, Serial, CreatedOn
FROM Table1
where DATEDIFF(M, CreatedOn,GETDATE())   >1
UNION
select ID,Name, Serial, CreatedOn from
(
SELECT *, ROW_NUMBER() over (partition by name order by createdon ) as seq
FROM Table1
where DATEDIFF(M, CreatedOn,GETDATE())  <=1
) T
where T.seq =1
person radar    schedule 29.10.2014
comment
Привет, спасибо за ваш ответ, но дело в том, что я не хочу сравнивать данные с данными за 1 месяц до текущей даты. Каждый элемент необходимо сравнить с его собственными записями. Например, имя элемента A может иметь 1 запись с датой создания 1 год назад и еще одну 2 месяца назад, поэтому они оба должны отображаться в отчете, а элемент B может иметь 1 запись с датой создания на прошлой неделе и еще одну 3 недели назад, поэтому записи двухнедельной давности для элемента B должны быть удалены. - person Erfan Zarger; 30.10.2014
comment
@ErfanZarger, у вас есть одна запись с датой декабря 2014 года? также этот сервер sql, тогда вышеуказанный запрос будет работать, я меняю его, не предполагая будущие даты. - person radar; 30.10.2014
comment
Я только что упомянул некоторые примеры данных, в моей фактической таблице тысячи записей, я до сих пор не понимаю, почему вы сравниваете дату кратедона с текущей датой, это неправильно. - person Erfan Zarger; 30.10.2014
comment
@ErfanZarger, я сравниваю с текущей датой, чтобы узнать, старше ли она 1 месяца. если он старше 1 месяца, возвращаются все записи, в противном случае получаются только самые старые в текущем месяце - person radar; 30.10.2014

Попробуй это :

Select bb.ID, aa.*
From (
    Select  Name, Serial, Min(CreatedOn) as CreatedOn
    From (Select Name, Serial, Left(CreatedOn, 4)+Substring(CreatedOn, 6, 2) as tPrd, CreatedOn From Table1 ) a
    Group By Name, Serial, tPrd
    ) aa
Left Join Table1 bb             --> to get column "ID"
    On bb.Name = aa.Name
    And bb.Serial = aa.Serial
    And bb.CreatedOn = aa.CreatedOn

Если вам не нужен столбец «ID».

Это запрос

Select  Name, Serial, Min(CreatedOn) as CreatedOn
From (Select Name, Serial, Left(CreatedOn, 4)+Substring(CreatedOn, 6, 2) as tPrd, CreatedOn From Table1 ) a
Group By Name, Serial, tPrd

этот запрос используется, если тип данных столбца "CreatedOn" является строковым.

Если тип данных столбца "CreatedOn" - дата, вы должны изменить

Left(CreatedOn, 4)+Substring(CreatedOn, 6, 2) as tPrd

изменить на

Convert(Varchar(6), CreatedOn, 112) as tPrd
person Asromi rOmi    schedule 06.11.2014