【问题标题】:Is it possible to add a identity to a GROUP BY using SQL?是否可以使用 SQL 向 GROUP BY 添加标识?
【发布时间】:2011-01-05 04:31:56
【问题描述】:

是否可以将标识列添加到 GROUP BY 以便每个重复项都有一个标识号?

我的原始数据是这样的:

1    AAA  [timestamp]
2    AAA  [timestamp]
3    BBB  [timestamp]
4    CCC  [timestamp]
5    CCC  [timestamp]
6    CCC  [timestamp]
7    DDD  [timestamp]
8    DDD  [timestamp]
9    EEE  [timestamp]
....

我想把它转换成:

1    AAA   1
2    AAA   2
4    CCC   1
5    CCC   2
6    CCC   3
7    DDD   1
8    DDD   2
...

解决办法是:

CREATE PROCEDURE [dbo].[RankIt]
AS
BEGIN
SET NOCOUNT ON;

SELECT  *, RANK() OVER(PARTITION BY col2 ORDER BY timestamp DESC) AS ranking 
FROM MYTABLE;

END

【问题讨论】:

    标签: sql sql-server tsql row-number


    【解决方案1】:

    如果您使用的是 Sql Server 2005,您可以尝试使用 ROW_NUMBER

    DECLARE @Table TABLE(
            ID INT,
            Val VARCHAR(10)
    )
    
    INSERT INTO @Table SELECT 1,'AAA'
    INSERT INTO @Table SELECT 2,'AAA'
    INSERT INTO @Table SELECT 3,'BBB' 
    INSERT INTO @Table SELECT 4,'CCC' 
    INSERT INTO @Table SELECT 5,'CCC' 
    INSERT INTO @Table SELECT 6,'CCC' 
    INSERT INTO @Table SELECT 7,'DDD' 
    INSERT INTO @Table SELECT 8,'DDD' 
    INSERT INTO @Table SELECT 9,'EEE' 
    
    SELECT  *,
            ROW_NUMBER() OVER(PARTITION BY VAL ORDER BY Val)
    FROM    @Table
    

    【讨论】:

    • 我尝试了 SELECT *, RANK() OVER (ORDER BY col2) AS 排名 FROM 表,它使我的 SQL2005 管理工作室崩溃......
    • 记得使用 PARTITION BY,就像例子中一样。
    • SELECT *,ROW_NUMBER() OVER (PARTITION BY col2) 也会使我的 sql 管理工作室崩溃。这个等级和分区的东西很奇怪....我想不通。
    • 你说的 CRASH 是什么意思?像致命错误一样,重启应用?
    • 让它工作起来很困难。非常感谢 asstander... 你让我找对了地方。我会用答案更新我的问题。
    【解决方案2】:
    create table #testalot
    (
      [id] int identity,
      data varchar(50)
    )
    
    insert #testalot (data) values('AAA')
    insert #testalot (data) values('AAA')
    insert #testalot (data) values('BBB')
    insert #testalot (data) values('CCC')
    insert #testalot (data) values('CCC')
    insert #testalot (data) values('CCC')
    insert #testalot (data) values('DDD')
    insert #testalot (data) values('DDD')
    
    select *,ROW_NUMBER() OVER(PARTITION BY data ORDER BY data DESC) AS 'Number'
     from #testalot
    
     drop table #testalot
    

    返回

    id  data Number
    1   AAA  1
    2   AAA  2
    3   BBB  1
    4   CCC  1
    5   CCC  2
    6   CCC  3
    7   DDD  1
    8   DDD  2
    

    【讨论】:

    • sigh...点击保存,页面会出现其他人在 3 分钟前输入相同的答案。
    • 我永远无法让它与 ROW_NUMBER() 一起使用。我最终使用了 RANK() 。
    • -耸肩-我测试了上面的代码。当你有关系时,它们实际上会给出不同的结果。
    猜你喜欢
    • 2011-08-14
    • 2020-07-16
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2010-12-22
    • 2021-09-01
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多