【问题标题】:Can I calculate 4 distinct groups in SQL for my set?我可以在 SQL 中为我的集合计算 4 个不同的组吗?
【发布时间】:2018-08-24 03:13:44
【问题描述】:

我有下面的问题,我必须在 SQL 中解决。该数据库在 SQL-Server 2005 上运行。 对于一组(年份和编号),该组应该是唯一的,例如在下面的集合中,我应该有 4 个组(1-4)而不是组(1-2)。 我不能更新表格,也不能修复应用程序。

我可以为我的集合计算 4 个不同的组,还是有不同的方法来解决这个问题?

year    |number |row    |group<br>
2004    |1000   |1  |1<br>
2004    |1000   |2  |1<br>
2004    |1000   |3  |1<br>
2004    |1000   |4  |1<br>
2004    |1000   |5  |2<br>
2004    |1000   |6  |2<br>
2004    |1000   |7  |2<br>
2004    |1000   |8  |2<br>
2004    |1000   |9  |1<br>
2004    |1000   |10 |1<br>
2004    |1000   |11 |1<br>
2004    |1000   |12 |1<br>
2004    |1000   |13 |2<br>
2004    |1000   |14 |2<br>
2004    |1000   |15 |2<br>
2004    |1000   |16 |2<br>

【问题讨论】:

  • 你能添加你想要的输出吗??
  • 第 9 - 12 行应该有第 3 组,第 13-16 行应该有第 4 组。Gordon Linoffs 解决方案正是这样做的。

标签: sql sql-server sql-server-2005


【解决方案1】:

如果我理解正确,您可以使用窗口函数。对于这个特定问题,您可以对行号使用算术运算。对于更一般的解决方案,这是一个“差距和岛屿”问题。在 SQL Server 2005 中,您可以使用窗口函数解决此问题:

select t.*,
       dense_rank() over (partition by year, number order by group, seqnum_r - seqnum_rg) as grp
from (select t.*,
             row_number() over (partition by year, number order by row) as seqnum_r,
             row_number() over (partition by year, number, group order by row) as seqnum_rg
      from t
     ) t;

理解为什么会这样工作有点棘手。重要的一点是,对于具有相似值的“岛”,两个序列号之间的差异是恒定的。 dense_rank() 然后只提供最终值。

以上将产生四个组,但它们的顺序可能不正确。为此,使用另一轮窗口函数得到最小值id

select t.*,
       dense_rank() over (partition by year, number order by minid) as grp
from (select t.*, min(id) over (partition by year, number, group, seqnum_r - seqnum_rg) as minid
      from (select t.*,
                   row_number() over (partition by year, number order by row) as seqnum_r,
                   row_number() over (partition by year, number, group order by row) as seqnum_rg
            from t
           ) t
     ) t;

【讨论】:

  • 谢谢。我还不明白你的解决方案,但它有效!我一定会研究你提到的一点(差距和岛屿)。此外,我将不得不研究 over 子句和 DENSE_RANK。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多