如何为表中存在的特定帐户生成序列号

时间:2016-08-22 21:39:36

标签: sql sql-server-2008

我有一种情况,如果其他表(table2)中不存在帐户,则下面的查询将生成序号1,否则它应为每个相同类型的帐户生成增量序列号。

查询:

select 
account_ID,
(case when (B.seq) is null then 1 else B.seq+1 end) as col1,
desc as desc
from table1
left join 
(select id, max(seq_no) seq from table2 group by id) B
on table1.id=B.id

:表2:

ID    account_id     seq_no
1      100            1
1      100            2
2      101            1

需要来自table1查询的预期结果:----------

account_id    col1     desc
102             1       abc
102             2       xyz
102             3       apc
100             3       pqr
100             4       mn
101             2       home
101             3       hall

请帮助我在sql server查询中获得此结果。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

根据您的问题,我认为您要求的是每个account_id的序列号,它将在Table2中的最大值之后开始一个值,但无论Table1中有多少个条目,它都会不断增加。

下面的查询使用ROW_NUMBER()函数创建序列。 PARTITION BY每个account_id会自动“重置”一次,而ORDER BY会告诉它序列中哪些行排在第一位(请注意,您没有说明这些行应该如何在原始帖子中排序,因此我随机选择了描述字段。

我使用相同的LEFT JOIN条件来标识该account_id可用的最大序列,并将其添加到ROW_NUMBER()值(如果已存在)。 ISNULL()旨在处理尚未包含序列的任何account_id值。

DECLARE @Table1 TABLE (account_id INT, descr VARCHAR(4))
DECLARE @Table2 TABLE (ID INT, account_id INT, seq_no INT)

INSERT INTO @Table1 (account_id,descr)
    SELECT 102, 'abc' UNION 
    SELECT 102, 'xyz' UNION 
    SELECT 102, 'apc' UNION 
    SELECT 100, 'pqr' UNION 
    SELECT 100, 'mn' UNION 
    SELECT 101, 'home' UNION 
    SELECT 101, 'hall'


INSERT INTO @Table2 (account_id,seq_no)
    SELECT 100, 1 UNION 
    SELECT 100, 2 UNION 
    SELECT 101, 1

SELECT
    a.account_id
   ,ROW_NUMBER() OVER (PARTITION BY a.account_id ORDER BY descr) + ISNULL(b.seq,0) AS col1
   ,a.descr AS descr
FROM @Table1 a
    LEFT JOIN
     (
         SELECT
             [@Table2].account_id
            ,MAX([@Table2].seq_no) seq
         FROM @Table2
         GROUP BY [@Table2].account_id
     ) B
        ON a.account_id = B.account_id

请注意,您必须使代码适应您自己的表/列名称,并可能优化分区函数中的ORDER BY:我给出了一个通用示例。