sql select query通过比较日期来删除行

时间:2014-10-29 20:47:08

标签: sql database date duplicates select-query

我需要在表上编写一个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

我的查询应该比较创建日期,如果有1个或多个记录名称和序列号相同且创建日期比其他日期少1个月,则需要删除它们。 例如,在我的示例表中,ID = 2的行应该从我的select查询中删除,因为它与第一行具有相同的数据且日期不到1个月,但它应该显示自创建以来的第三行日期超过1个月。

如何编写此选择查询?

谢谢,

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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