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
非常感谢任何解决方案或指示,谢谢你。
答案 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
个值的岛屿。使用MIN
,MAX
函数,我们可以计算每个岛屿的开始和结束日期。
答案 1 :(得分:0)
我会分两步解决这个问题。这是我将采取的方法的伪代码:
更新表格,设置FirstDate = MIN(FirstDate)和LastDate = MAX(LastDate)并按所有其他列分组。
使用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。请原谅我的格式,我在去的码头上使用移动版。