2014-10-29 3 views
0

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

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 

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

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

Спасибо,

+0

это оракул или MS SQL или MySQL? – radar

ответ

0

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

Синтаксис основан на MS SQL, если это другие DMBS, то функции даты должны быть изменены.

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 
+0

Привет, спасибо за ваш ответ, но факт в том, что я не хочу сравнивать данные с данными за 1 месяц от текущей даты. Каждый элемент нужно сравнивать с его собственными записями. Как и имя элемента A может иметь 1 запись с createdon date 1 год назад и еще один месяц назад, так что оба они должны появиться в отчете, а элемент B может иметь 1 запись с createdon на прошлой неделе и еще одну 3 недели назад, поэтому записи с 2 недель назад для элемента B должны быть удалены. –

+0

@ErfanZarger, у вас есть одна запись с датой в декабре 2014 года? также этот sql-сервер, тогда над запросом будет работать, я меняю его с учетом будущих дат. – radar

+0

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

0

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

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