1

我有一张这样的桌子

| winner | year |
|--------|------|
| alice  | 1999 |
| bob    | 2000 |
| bob    | 2001 |
| alice  | 2003 |
| alice  | 2005 |
| alice  | 2007 |

我想推断不重叠的咒语,即看起来像的表格。

| winner | start| end  |
|--------|------|------|
| alice  | 1999 | 1999 |
| bob    | 2000 | 2001 |
| alice  | 2003 | 2007 |

在python中,我会做类似的事情

winners = [(1999, 'alice'),
           (2000, 'bob'),
           (2001, 'bob'),
           (2003, 'alice'),
           (2005, 'alice'),
           (2007, 'alice')]
winners.sort()

spells = []
spell = {}
for year, name in winners:
    if spell:
        if name == spell['name']:
            spell['end'] = year
        else:
            spells.append(spell)
            spell = {'name': name, 'start': year, 'end': year}
    else:
        spell = {'name': name, 'start': year, 'end': year}

但我不确定如何在 SQL 中实现相同的结果。

4

1 回答 1

0

这是一个空白和孤岛问题。最简单的方法是使用row_number()

select name, min(year), max(year)
from (select t.*, row_number() over (partition by name order by year) as seqnum
      from t
     ) t
group by name, year - seqnum
于 2020-10-18T15:24:49.190 回答