【问题标题】:sql select query remove rows by comparing datessql select查询通过比较日期删除行
【发布时间】:2014-12-25 18:00:02
【问题描述】:

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

如何编写这个选择查询?

谢谢,

【问题讨论】:

  • 是oracle还是ms sql还是mysql?

标签: sql database date duplicates select-query


【解决方案1】:

您可以使用 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 个月后的数据进行比较。每个项目都需要与自己的记录进行比较。就像项目名称 A 可以有 1 条记录,其中 createdon 日期是 1 年前,另一条记录是 2 个月前,所以它们都应该出现在报告中,并且项目 B 可以有 1 条记录,createdon 是上周,另一条记录是 3 周前,所以应删除 2 周前 B 项的记录。
  • @ErfanZarger,您有一条记录,日期为 2014 年 12 月?也是这个 sql 服务器然后上面的查询将起作用,我正在更改它而不假设未来的日期。
  • 我刚才提到了一些示例数据,我的实际表有数千条记录,我还是不明白你为什么要比较 cratedon 日期和当前日期,这是不对的。
  • @ErfanZarger,我正在与当前日期进行比较,看看它是否早于 1 个月大。如果超过 1 个月,则重新检索所有记录,否则仅在当前月份获取最旧的记录
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多