【问题标题】:how to get different sequence id for each group when selecting -- in sql server 2000?在 sql server 2000 中选择时如何为每个组获取不同的序列 ID?
【发布时间】:2013-12-11 17:48:23
【问题描述】:

我有一个像 id、categoryId 这样的表和像这样的示例数据

       id   categoryid
        1      74
        2      74
        3      75
        4      75
        5      76
        6      76

这个。

我想要如下所示的结果数据集。

        id   categoryid  row
         1      74        1
         2      74        1
         3      75        2
         4      75        2
         5      76        3
         6      77        4

任何人都可以帮助我解决这个问题。 任何回复将不胜感激。

【问题讨论】:

  • categoryid 77 是从哪里来的?您的意思是要将 77 也放入样本数据中吗?
  • 你还尝试过什么?哪些教程或文档您不理解,我们可以帮助您理解?
  • 抱歉有错误,77 是我应该在示例数据中提到的另一个类别。

标签: sql tsql sql-server-2000


【解决方案1】:
create table #tmp (id int, categoryid int)
create table #categoryid (categoryid int, sequencenumber int identity(1,1))

insert into #tmp values (1,74)
insert into #tmp values (2,74)
insert into #tmp values (3,75)
insert into #tmp values (4,75)
insert into #tmp values (5,76)
insert into #tmp values (6,77)

insert into #categoryid (categoryid)
select distinct categoryid
from #tmp
order by categoryid

select t.id, t.categoryid, c.sequencenumber
from #tmp t
join #categoryid c
    on t.categoryid = c.categoryid

令人惊讶的是,我们很快就忘记了在 ROW_NUMBER() 之前的生活......这可能不是最好的答案,但它是第一个出现在我脑海中的答案。玩得开心!

【讨论】:

  • 我不认为INSERT INTO...SELECT...ORDER BY 保证您将按指定顺序获得标识值。鉴于该问题专门询问了 SQL Server 2000,它将在哪里工作,这可能没问题,但值得指出,因为它可能会阻止在稍后阶段升级到更新版本的 SQL Server。
  • @hvd,我为我的无知道歉......我从来没有真正看到它不起作用,并且在订购某些东西时自然假设......然后插入......它会起作用。你是在告诉我这在 SQL 2008/2012 中并不总是有效。为了我的教育..你知道任何揭示这一点的文档/博客吗?谢谢。
  • 一般来说,文档中没有明确的承诺意味着你不能依赖它。但是,在这种情况下,我似乎说得太早了,因为Microsoft have specifically documented this(只要知识库文章算作文档)。所以,为你 +1。
  • 总而言之……身份函数不可靠,但身份列可靠。谢谢你的信息,hvd!
【解决方案2】:

在 SQL Server 2000 中,没有对此的内置支持。较新版本的 SQL Server 通过 DENSE_RANK() 函数支持此功能:

select id, categoryid, dense_rank() over (order by categoryid) from sample;

但这必须被模拟才能获得适用于 2000 年的东西。本质上,行号是到目前为止看到的不同类别(包括当前类别)的数量,并且很容易表达:

select id, categoryid, (
    select count(distinct categoryid) 
    from sample as sub 
    where categoryid <= sample.categoryid) 
from sample;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2011-03-22
    • 2023-03-11
    • 2016-01-12
    • 2020-09-27
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多