我有一种情况,如果其他表(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查询中获得此结果。 提前谢谢。
答案 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
:我给出了一个通用示例。