考虑一下按T
排序的表Col1, Col2, Date1, Date2
:
Col1 Col2 Date1 Date2 rate
ABC 123 11/4/2014 11/5/2014 -90
ABC 123 11/4/2014 11/6/2014 -55
ABC 123 11/4/2014 11/7/2014 -90
ABC 123 11/4/2014 11/10/2014 -90
我想对数据进行分组,以便轻松审核/减少重复,所以我有
Col1 Col2 Date1 start_Date2 end_Date2 rate
ABC 123 11/4/2014 11/5/2014 11/5/2014 -90
ABC 123 11/4/2014 11/6/2014 11/6/2014 -55
ABC 123 11/4/2014 11/7/2014 11/10/2014 -90
如果我可以使用编号为1 2 3 3
的行(仅重要的是数字不同),然后GROUP BY
该列,我可以轻松地执行此操作。
我对查询的尝试:
SELECT *, DENSE_RANK() OVER (ORDER BY rate) island
FROM T
ORDER BY Date2
没有给出我想要的东西:
Col1 Col2 Date1 Date2 rate island
ABC 123 11/4/2014 11/5/2014 -90 1
ABC 123 11/4/2014 11/6/2014 -55 2
ABC 123 11/4/2014 11/7/2014 -90 1
ABC 123 11/4/2014 11/10/2014 -90 1
我希望查询识别第二组-90
值应被视为新组,因为它们出现在具有不同rate
的组之后。
[gap-and-islands] SQL标签非常有用,但是当速率恢复到之前的值时,我无法弄清楚如何处理。我该如何修改我的查询?
答案 0 :(得分:2)
您可以使用row_numbers()
的差异来识别群组。连续值将具有常量。
select col1, col2, date1, min(date2), max(date2), rate
from (select t.*,
(row_number() over (partition by col1, col2, date1 order by date2) -
row_number() over (partition by col1, col2, date1, rate order by date2)
) as grp
from table t
) t
group by col1, col2, date1, rate, grp