2014-10-29 45 views
0

我需要在表上寫一個sql select查詢,但是我有1個特殊情況,我有問題。我的表結構如下圖所示:sql select查詢通過比較日期去除行

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個月比其他的人年紀大了,他們需要被刪除。 例如,在我的示例表中,ID = 2的行應該從我的選擇查詢中刪除,因爲它具有與第一行相同的數據,並且日期比舊的小1個月,但它應顯示自第在日期創建的時間比一個月大1個月。

我該如何編寫這個select查詢?

感謝,

+0

是Oracle或MS SQL或MySQL? – radar 2014-10-29 20:49:27

回答

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條記錄,其中創建日期爲1年前,另一個爲2個月前,因此它們都應顯示在報告中,項目B可以在上週創建1條記錄,3周前創建1條記錄,所以應該刪除2周前的項目B的記錄。 – 2014-10-30 13:53:50

+0

@ErfanZarger,你有一個記錄日期爲2014年12月?也是這個SQL服務器然後上面的查詢將工作,我正在改變它未來的日期。 – radar 2014-10-30 17:03:45

+0

我剛剛提到了一些示例數據,我的實際表格有成千上萬的記錄,我仍然不明白你爲什麼要將抄寫日期與當前日期進行比較,那是不對的。 – 2014-10-30 19:05:06

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