在同一行加入选择以获得相同的结果ID

Posted

技术标签:

【中文标题】在同一行加入选择以获得相同的结果ID【英文标题】:Joining select on one row for same result id 【发布时间】:2019-04-28 20:43:25 【问题描述】:

我有以下查询结果(我将此结果存储在#TMP 表中)

Id  |  Letter  |  Column1  |  Column2
1   |  A       |  400      |  200
1   |  A       |  101      |  201
1   |  A       |  102      |  203
2   |  A       |  100      |  200
2   |  A       |  700      |  201
2   |  A       |  102      |  202

我想要做的是对该#TMP 表进行选择,但现在我想要这样的输出:

Id  |  Letter  |  Alias1  |  Alias2  | Alias1-1  |  Alias2-1 |  Alias1-2  | Alias2-2
1   |  A       |  400     |  200     | 101       |  201      |  102       | 203  
2   |  A       |  100     |  200     | 700       |  201      |  102       | 202  

我怎样才能做到这一点?我尝试加入,但我得到了很多相同的结果。

select A.Id, A.Letter, B.Column1, B.Column2
from #TMP A
inner join #TMP B ON A.Id = B.Id AND A.Letter = B.Letter

我也尝试过分组

select Id, Letter, Column1, Column2
from #TMP
group by Id

但是此查询要求按语法将字母、column1、column2 添加到组中,如果我这样做,我会得到与 select * from #TMP 相同的结果

PD:#TMP 表必须始终包含 3 个相同的 id,letter 行

PD2:对于具有相同 Id 的结果,Column1 的值可能在一行中大于 Column2 的值,而在下一行中,column2 的值可能大于 column1。

【问题讨论】:

您确实需要一个行排序列来确保每次都获得相同的结果。 【参考方案1】:

row_number()窗口函数可以和conditional aggregation一起使用

with t(Id,Letter,Column1,Column2) as
(
    select 1,'A',100,200 union all
    select 1,'A',101,201 union all 
    select 1,'A',102,203 union all
    select 2,'A',100,200 union all
    select 2,'A',101,201 union all
    select 2,'A',102,202
), t2 as
(
select
    *,
    row_number() over (partition by Id,Letter order by Column1) as rn
  from [t]
)    
select Id,Letter,
       max(case when rn = 1 then Column1 end ) as [Alias1],
       max(case when rn = 2 then Column1 end ) as [Alias2],
       max(case when rn = 3 then Column1 end ) as [Alias1-1],
       max(case when rn = 1 then Column2 end ) as [Alias2-0],
       max(case when rn = 2 then Column2 end ) as [Alias2-1],
       max(case when rn = 3 then Column2 end ) as [Alias2-2] 
  from t2
 group by Id,Letter 

Demo

【讨论】:

以上是关于在同一行加入选择以获得相同的结果ID的主要内容,如果未能解决你的问题,请参考以下文章

文字div在一行

MySQL:在同一行中的某些条件下选择值和最小值

当用户在 GridView ASP.NET 中选择一行时如何自动选择相同 ID 的其他行

Oracle 8i 从具有相同 ID 但不同状态的多行数据集中选择查询

强制解开已在同一行代码中选择性访问的变量是不是安全?

创建一个循环以在同一行中记录下一个记录时间和日期(基于唯一 ID)