我有两个桌子, 表1:
col4 col5
0 Tom 20
1 nick 21
2 krish 19
3 jack 18
表2:
col1 col2 col3
0 xxx Tom 110
1 yyy nick 121
2 zzz krish 119
3 xxx jack 118
4 yyy Tom 141
5 xxx nick 156
6 yyy krish 176
7 zzz jack 186
我需要在基于col2和col4的表2中具有col5。 col2中重复值的col5值应分配为0(第一个值除外)。例如,Tom正在重复,并且在与表1合并后,仅将Tom(索引0)的第一个值分配给20。 Tom的另一个值应为0(索引4)。 我希望结果表列为:
col1 col2 col3 col5
0 xxx Tom 110 20
1 yyy nick 121 21
2 zzz krish 119 19
3 xxx jack 118 18
4 yyy Tom 141 0
5 xxx nick 156 0
6 yyy krish 176 0
7 zzz jack 186 0
请帮助我实现这一目标。预先感谢。
答案 0 :(得分:1)
SQL表表示无序集。除非有列指定顺序,否则没有“第一”行。
假设您有这样一列,则可以像这样使用left join
和row_number()
:
select t2.*,
(case when row_number() over (partition by t2.col4 order by ?) = 1
then t2.col5 else 0
end) as col5
from table2 t2 left join
table1 t1
on t2.col4 = t1.col2;
答案 1 :(得分:0)
首先,正常连接两个表:
SELECT *
FROM Table1
INNER JOIN Table2 ON Table1.col4=Table1.col2
然后结果很清楚:
col1 col2 col3 col5
0 xxx Tom 110 20
1 yyy nick 121 21
2 zzz krish 119 19
3 xxx jack 118 18
4 yyy Tom 141 20
5 xxx nick 156 21
6 yyy krish 176 19
7 zzz jack 186 18
在那之后,让我们为每个人添加一个行号,然后只选择第一个:
SELECT t.col1,t.col2,t.col3, CASE WHEN t.Rn=1 THEN t.col5 ELSE 0 END col5
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY Table1.col4 ORDER BY Table2.Col1) Rn
FROM Table1
INNER JOIN Table2 ON Table1.col4=Table1.col2) t