【问题标题】:SQL deleting rows with duplicate dates conditional upon values in two columnsSQL删除具有重复日期的行,条件是两列中的值
【发布时间】:2016-02-11 01:18:58
【问题描述】:

我有大约 1000 个人的数据,其中每个人可以有多个行、多个日期,并且列表示所接受的程序和一个代码。

我需要每一行都包含一个不同的日期,所以我需要从我的表中删除重复日期的行。如果有多行具有相同的日期,我需要保留具有最低代码编号的行。在多行具有相同日期和相同最低代码的情况下,我需要保留也已在程序(prog)B中的行。例如;

| ID |     DATE   | CODE | PROG|            
--------------------------------
| 1  | 1996-08-16 | 24   |  A  |
| 1  | 1997-06-02 | 123  |  A  |
| 1  | 1997-06-02 | 123  |  B  |
| 1  | 1997-06-02 | 211  |  B  |
| 1  | 1997-08-19 |  67  |  A  |
| 1  | 1997-08-19 |  23  |  A  |

所以我想要的输出应该是这样的;

| ID |     DATE   | CODE | PROG|            
--------------------------------
| 1  | 1996-08-16 | 24   |  A  |
| 1  | 1997-06-02 | 123  |  B  |
| 1  | 1997-08-19 |  23  |  A  |

我正在努力想出一个解决方案,所以非常感谢任何帮助!

微软 SQL Server 2012 (X64)

【问题讨论】:

  • 我偏爱使用窗口函数并按您认为必要的列进行分区。这是一个链接,文章底部描述了该技术。可能会让你大部分时间到达那里。 simple-talk.com/sql/t-sql-programming/…
  • 只是日期?如果您有不同的行 ID 但日期相同怎么办?
  • 好点,每个唯一 ID 仅重复日期。因此,如果有意义的话,仍然会有重复但不在每个唯一 ID 内
  • 你可能想看这里,stackoverflow.com/questions/2594829/…
  • 我会使用窗口函数和 cte 来执行此操作,例如 HERE

标签: sql sql-server-2012


【解决方案1】:

以下内容适用于您的测试数据

SELECT ID, date, MIN(code), MAX(prog) FROM table
GROUP BY date

然后,您可以使用此查询的结果来创建新表或填充新表。或者删除该查询未返回的所有记录。

SQLFiddle http://sqlfiddle.com/#!9/0ebb5/5

【讨论】:

  • 干杯!谢谢没有考虑使用 MAX(prog) 因为它是字符串。
【解决方案2】:

可以使用min()函数:(详见here

select ID, DATE, min(CODE), max(PROG)
from table
group by DATE

我假设您的表有一个有效的主键。但是我建议您将ID作为主键。希望这会对你有所帮助。

【讨论】:

  • 我不认为这可以处理这种情况“如果不止一行具有相同的日期和相同的最低代码,那么我需要保留也已经在程序中的行(prog) B"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2015-12-22
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多