首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL等级分组变异

SQL等级分组变异
EN

Stack Overflow用户
提问于 2015-01-30 11:02:06
回答 2查看 289关注 0票数 0

考虑到由列ID和代码组成的原始数据集,我试图实现以下“级别”结果。

代码语言:javascript
复制
id   code   rank
1     A      1
2     A      1
3     A      1
4     B      2
5     B      2
6     C      3
7     C      3
8     C      3
9     A      4
10    A      4

使用代码列上的RANK_DENSE指令,我得到以下结果(在行之间的“中断”之后,A代码也获得相同的秩值)

代码语言:javascript
复制
id   code   rank
1     A      1
2     A      1
3     A      1
4     B      2
5     B      2
6     C      3
7     C      3
8     C      3
9     A      1
10    A      1

是否有可能实现第一个(示例)表中所示的结果,当由id: 1-2-3组成的组与由id: 9-10组成的组之间不使用游标时,A代码更改等级?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-30 11:13:38

你想要找到一系列的值,并给他们一个等级。您可以使用行号的不同方法来完成这一任务。以下为每个分组分配不同的编号:

代码语言:javascript
复制
select o.*, dense_rank() over (order by grp, code)
from (select o.*,
             (row_number() over (order by id) -
              row_number() over (partition by code order by id)
             ) as grp
      from original o
     ) o;

如果希望分配与原始数据相同的顺序,则可以通过id进行排序,但这需要一个额外的窗口函数:

代码语言:javascript
复制
select o.*, dense_rank() over (order by minid) as therank
from (select o.*, min(id) over (partition by grp, code) as minid
      from (select o.*,
                   (row_number() over (order by id) -
                    row_number() over (partition by code order by id)
                   ) as grp
            from original o
           ) o
     ) o;
票数 3
EN

Stack Overflow用户

发布于 2015-01-30 11:21:19

如果当前与前一行相同,则之和。工作于Server 2012。

代码语言:javascript
复制
WITH CTE AS (
    SELECT id, code,
        CASE Code WHEN LAG(CODE) OVER (ORDER BY id) THEN 0 ELSE 1 END AS Diff
    FROM Table1)
SELECT id, code, SUM(Diff) OVER (ORDER BY id) FROM CTE

How to make row numbering with ordering, partitioning and grouping也可以看到类似的问题

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28234450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档