创建一个数字起始序列或每组ID

时间:2016-10-30 12:42:47

标签: sql-server tsql sql-server-2014

我有3个源表,必须将它们全部联合起来

来源1:

Id   name  car   
-------------------
1    aaa    BMW   
1    aaa    Porche     
1    aaa    Nissan
2    bbb    Nissan
2    bbb    Honda

来源2:

Id   name  car   
-------------------
1    aaa    Camry   

来源3:

Id   name  car   
---------------------
1    aaa    Honda   
1    aaa    Ford     
2    bbb    Buick

现在我想将它们全部组合并插入带有序列的表中。此序列将为每个ID重复增量值。

目标表:

Id   name    car   sequence
--------------------------------
1    aaa    BMW        1
1    aaa    Porche     2 
1    aaa    Nissan     3
1    aaa    Camry      4
1    aaa    Honda      5
1    aaa    Ford       6
2    bbb    Nissan     1
2    bbb    Honda      2
2    bbb    Buick      3

我知道我必须使用row_number()和分区,但无法使用此函数捕获Union的序列。但是,我可以将它们插入临时表并使用row_number创建另一个临时表,它可以正常工作。

我也无法使用row_number()更新列。我想知道是否有联合的直接方法,或者我是否可以更新目标表?

3 个答案:

答案 0 :(得分:1)

不确定我是否完全理解您的问题,但这会使用ROW_NUMBER为三个表的并集选择序列ID:

;WITH ct AS (
    SELECT *
    FROM (VALUES(1,'aaa','BMW'),(1,'aaa','Porsche'),(2,'bbb','Nissan'),(2,'bbb','Honda')) AS T(id,name,car)
    UNION ALL
    SELECT *
    FROM (VALUES(1,'aaa','Camry')) AS T(id,name,car)
    UNION ALL
    SELECT *
    FROM (VALUES(1,'aaa','Honda'),(2,'bbb','Buick')) AS T(id,name,car)
)
SELECT
    *,
    rn=ROW_NUMBER() OVER (PARTITION BY name ORDER BY car)
FROM
    ct;

结果是:

╔════╦══════╦═════════╦════╗
║ id ║ name ║   car   ║ rn ║
╠════╬══════╬═════════╬════╣
║  1 ║ aaa  ║ BMW     ║  1 ║
║  1 ║ aaa  ║ Camry   ║  2 ║
║  1 ║ aaa  ║ Honda   ║  3 ║
║  1 ║ aaa  ║ Porsche ║  4 ║
║  2 ║ bbb  ║ Buick   ║  1 ║
║  2 ║ bbb  ║ Honda   ║  2 ║
║  2 ║ bbb  ║ Nissan  ║  3 ║
╚════╩══════╩═════════╩════╝

答案 1 :(得分:1)

看起来简单而懒惰的方式: 创建临时表并按如下方式存储日期

create table #Temp
(
Id int,
Name nvarchar(50),
Car nvarchar(50)
)
insert into #Temp select * from Source1
insert into #Temp select * from Source2
insert into #Temp select * from Source3
select ID, Name, Car,ROW_NUMBER() over (partition by Id Order by Id)  as sequence  from #Temp
--OR
--select ID, Name, Car,ROW_NUMBER() over (partition by Id Order by Id)  as sequence into #Result  from #Temp
--select * from #Result
--OR
--select Id, Name, Car,
--  Row_Number( ) over ( partition by Id order by Id ) as Sequence from
--  (
--select Id , Name, Car from Source1 union all
--select Id , Name, Car from Source2 union all
--select Id , Name, Car from Source3
--) as Result

答案 2 :(得分:1)

表中似乎没有特定的行顺序。这允许结果变化。它就是这样。

-- Sample data.
declare @Source1 as Table ( Id Int, Name VarChar(3), Car VarChar(10) );
insert into @Source1 ( Id, Name, Car ) values
  ( 1, 'aaa', 'BMW' ), ( 1, 'aaa', 'Porsche' ), ( 1, 'aaa', 'Nissan' ),
  ( 2, 'bbb', 'Nissan' ), ( 2, 'bbb', 'Honda' );
select * from @Source1;

declare @Source2 as Table ( Id Int, Name VarChar(3), Car VarChar(10) );
insert into @Source2 ( Id, Name, Car ) values
  ( 1, 'aaa', 'Camry' );
select * from @Source2;

declare @Source3 as Table ( Id Int, Name VarChar(3), Car VarChar(10) );
insert into @Source3 ( Id, Name, Car ) values
  ( 1, 'aaa', 'Honda' ), ( 1, 'aaa', 'Ford' ), ( 2, 'bbb', 'Buick' );
select * from @Source3;

-- Unstable query.
select Id, Name, Car,
  Row_Number( ) over ( partition by Id order by TableId ) as Sequence
  from (
    select 1 as TableId, Id, Name, Car from @Source1 union all
    select 2, Id, Name, Car from @Source2 union all
    select 3, Id, Name, Car from @Source3 ) as Edgar