【问题标题】:Remove duplicate rows query result except for one in Microsoft SQL Server?删除重复行查询结果,除了 Microsoft SQL Server 中的一个?
【发布时间】:2015-06-24 13:00:35
【问题描述】:

如何从 Microsoft SQL Server 表中删除所有重复的月份?

例如,使用我刚刚创建的以下语法:

SELECT * FROM Cash WHERE Id = '2' AND TransactionDate between '2014/07/01' AND '2015/02/28'

查询结果为:

+----+-------------------------+
|Id  | TransactionDate         |
+----+-------------------------+
| 2  | 2014-07-22 00:00:00.000 |
| 2  | 2014-08-09 00:00:00.000 |
| 2  | 2014-08-25 00:00:00.000 |
| 2  | 2014-08-29 00:00:00.000 |
| 2  | 2015-01-27 00:00:00.000 |
| 2  | 2015-01-28 00:00:00.000 |
+----+-------------------------+ 

我将如何删除重复的月份,每个月份只返回任何 1 个值,如下所示:

+----+-------------------------+
|Id  | TransactionDate         |
+----+-------------------------+
| 2  | 2014-07-22 00:00:00.000 |
| 2  | 2014-08-09 00:00:00.000 |
| 2  | 2015-01-27 00:00:00.000 |
+----+-------------------------+ 

【问题讨论】:

  • 您要删除还是不选择它们?
  • 只是不要选择它们,这样就不会出现重复月份的查询结果。

标签: sql sql-server sql-server-2008 duplicate-removal


【解决方案1】:

您可以在ROW_NUMBER 的帮助下完成。

这将告诉您要保留哪些行

SELECT id,transactionDate, ROW_NUMBER() OVER ( PARTITION BY YEAR(TransactionDate ),MONTH(TransactionDate ) ORDER BY TransactionDate ) firstTrans
FROM Cash 
WHERE Id = '2' AND 
TransactionDate between '2014/07/01' AND '2015/02/28'

您可以使用 CTE 删除其他行。

with myCTE (id,transactionDate, firstTrans) AS (
 SELECT id,transactionDate, ROW_NUMBER() OVER ( PARTITION BY YEAR(TransactionDate ),MONTH(TransactionDate ) ORDER BY TransactionDate ) firstTrans
    FROM Cash 
    WHERE Id = '2' AND 
    TransactionDate between '2014/07/01' AND '2015/02/28'
)
delete from myCTE where firstTrans <> 1

每年每个月只保留一笔交易。

编辑:

按row_number过滤,只返回你想要的行

 select id, transactionDate from (SELECT id,transactionDate, ROW_NUMBER() OVER ( PARTITION BY YEAR(TransactionDate ),MONTH(TransactionDate ) ORDER BY TransactionDate ) firstTrans
    FROM Cash 
    WHERE Id = '2' AND 
    TransactionDate between '2014/07/01' AND '2015/02/28') where firstTrans = 1

【讨论】:

    【解决方案2】:

    当您运行此查询时,您将获得每年每个月的最高 ID。

    SELECT MAX(<IdColumn>) AS Id, YEAR(<DateColumn>) AS YE, MONTH(<DateColumn>) AS MO FROM <YourTable>
    GROUP BY YEAR(<DateColumn>), MONTH(<DateColumn>)
    

    如果需要,例如,您可以延迟删除其 ID 不在此查询中的行。

    【讨论】:

      【解决方案3】:

      每月只选择第一行

      SELECT *
      FROM Cash c
      WHERE c.Id = '2' 
      AND c.TransactionDate between '2014/07/01' AND '2015/02/28'
      AND NOT EXISTS ( SELECT 'a'
                         FROM Cash c2
                         WHERE c2.Id = c.Id
                         AND YEAR(c2.TransactionDate) * 100 + MONTH(c2.TransactionDate) = YEAR(c.TransactionDate) * 100 + MONTH(c.TransactionDate)
                         AND c2.TransactionDate < c.TransactionDate
                     )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-25
        • 2020-02-17
        相关资源
        最近更新 更多