删除重复的行查询结果,除了Microsoft SQL Server中的一个?

时间:2015-04-17 15:18:58

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

如何从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个月的任何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 |
+----+-------------------------+ 

3 个答案:

答案 0 :(得分:2)

您可以在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

答案 1 :(得分:0)

仅选择每月的第一行

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
               )

答案 2 :(得分:0)

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

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

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