我需要在表上编写一个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个月。
如何编写此选择查询?
谢谢,
答案 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