0

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

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

如何编写此选择查询?

谢谢,

4

2 回答 2

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
于 2014-11-06T08:56:44.967 回答
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
于 2014-10-29T21:06:17.450 回答