合并sql表中的重复行

时间:2015-05-26 12:21:50

标签: sql-server

FirstDate   LastDate    BaseCUR ConvertedCUR    RATE    
20070501    20070531    USD........EUR.................1.369748 
20070601    20070615    USD........EUR.................1.354772 
20070616    20070702    USD........EUR.................1.354772 
20070703    20070727    USD........EUR.................1.343621 
20070728    20070731    USD........EUR.................1.343621 
20070801    20070831    USD........EUR.................1.376050 
20070901    20071002    USD........EUR.................1.369748 

以下是我的数据库示例,我的任务是将以下行的'FirstDate''LastDate'与相同的'RATE'合并为一行。

我已尝试使用ROW_NUMBER()对这些重复'RATE'进行分组,但它也会将那些与其他行不相邻的行分组,但我无法将所有这些行合并

是否可以在不使用任何if-else或while循环的情况下实现此查询?

结果必须如下:

FirstDate   LastDate    BaseCUR ConvertedCUR  RATE  
20070501    20070531    USD........EUR........1.369748  
20070601    20070702    USD........EUR........1.354772<<< the dates are merged  
20070703    20070731    USD........EUR........1.343621<<< the dates are merged  
20070801    20070831    USD........EUR........1.376050  
20070901    20071002    USD........EUR........1.369748  

非常感谢任何解决方案或指示,谢谢你。

3 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

SELECT MIN(FirstDate) AS FirstDate, MAX(LastDate) AS LastDate,
       BaseCUR, ConvertedCUR, RATE
FROM (
SELECT *,
       ROW_NUMBER() OVER (ORDER BY FirstDate)  -
       RANK() OVER (PARTITION BY RATE ORDER BY FirstDate) AS rnk
FROM mytable ) t
GROUP BY BaseCUR, ConvertedCUR, RATE, rnk
ORDER BY FirstDate

GROUP BY RATE, rnk标识了连续RATE个值的岛屿。使用MINMAX函数,我们可以计算每个岛屿的开始和结束日期。

Demo here

答案 1 :(得分:0)

我会分两步解决这个问题。这是我将采取的方法的伪代码:

  1. 更新表格,设置FirstDate = MIN(FirstDate)和LastDate = MAX(LastDate)并按所有其他列分组。

  2. 使用ROW_NUMBER消除所有重复的行。

答案 2 :(得分:0)

我认为MERGE将获得相同RATE,BaseCUR和ConvertedCUR的最早FirsDate和最新LastDate。 如果是这样的话:

SELECT MIN(FirstDate),MAX(LastDate),BaseCUR,ConvertedCUR,RATE FROM YourTable GROUP BY BaseCUR,ConvertedCUR,RATE;

P.S。请原谅我的格式,我在去的码头上使用移动版。