有一个表Table1
,其行如下所示。列Label
存储列Tag
的优先级。
同样在列Label
中 - L1是第一优先级,L2是第二优先级,L3是最低优先级。
我有Value
列,其中包含标记的值,可以为null。
RecordNo. Lable Tag Value
----------------------------------------------
1 L1 T1
2 L2 T1 D12
3 L3 T1 D13
4 L1 T2 D21
5 L2 T2
6 L3 T3
7 L2 T3 D31
8 L2 T4
9 L3 T4 D41
10 L3 T5 D51
我想编写一个查询来获取如下输出。
对于每个Tag,如果找不到L1的值,那么我们将搜索L2,如果找不到L2数据,则搜索L3.So在任何时候它都应该返回非空值的标记。
输出如下所示。
RecordNo. Lable Tag Value
---------------------------------------------------------
2 L2 T1 D12
4 L1 T2 D21
7 L2 T3 D31
9 L3 T4 D41
10 L3 T5 D51
任何人都可以查看以上查询吗?
提前致谢。
答案 0 :(得分:3)
您可以使用ROW_NUMBER
:
;WITH Cte AS(
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY Tag ORDER BY Lable)
FROM Table1
WHERE Value IS NOT NULL
)
SELECT
RecordNo, Lable, Tag, Value
FROM Cte
WHERE RN = 1
答案 1 :(得分:0)
cte with Min应该做的伎俩
;WITH cte AS (
SELECT Tag,
MIN(Lable) AS Lable
FROM Table1
WHERE Value IS NOT NULL
GROUP BY Tag
)
SELECT *
FROM Table1 t1
JOIN cte c ON t1.Lable = c.Lable
AND t1.Tag = c.Tag
答案 2 :(得分:0)
使用此代码:
create table #test
(
Record_no int,
label varchar(4),
Tag varchar(4),
Value varchar(6)
)
insert into #test values(1,'L1','T1','')
insert into #test values(2,'L2','T1','D12')
insert into #test values(3,'L3','T1','D13')
insert into #test values(4,'L1','T2','D21')
insert into #test values(5,'L2','T2','')
insert into #test values(6,'L3','T3','')
insert into #test values(7,'L2','T3','D31')
insert into #test values(8,'L2','T4','')
insert into #test values(9,'L3','T4','D41')
insert into #test values(10,'L3','T5','D51')
Select * from #test
;With Cte as
(
Select *,ROW_NUMBER() over (partition by tag order by tag) as rownum
from #test
where Value<>''
)
select Record_no,label,tag,value from CTE
where ROWNUM=1
输出:
Record_no label tag value
2 L2 T1 D12
4 L1 T2 D21
7 L2 T3 D31
9 L3 T4 D41
10 L3 T5 D51
答案 3 :(得分:0)
如果我们假设表名是记录,那么查询将如下所示。
with recordcte(recordno, label, tag, value,Rank) as
(select recordno,
label,
tag,
value,
rank() over(partition by Tag order by newid() )
from records where value is not null)
select recordno,
label,
tag,
value
from recordcte where Rank=1
以下查询,即CTE(公用表表达式)
的定义 select recordno, label, tag, value, rank() over(partition by Tag order by newid() from records where value is not null)
正在消除值列中具有null的行,并通过在行标记值上对它们进行分区来为行生成排名。
关于CTE的以下查询
select recordno, label,tag,value from recordcte where Rank=1
将仅显示排名为1的行,以便您获得与值相关联的标记,该标记也是与该值关联的第一个标记。
我希望这能满足你的要求。
答案 4 :(得分:0)
您可以设置L1,L2,L3或L3,L1,L2或L2,L3,L1的顺序
从Table1中选择不同的Lable,Tag,Value,其中Lable = L1 联盟 从Table1中选择不同的Lable,Tag,Value Lable = L2和 标记不在(从表1中选择不同的标签,其中Lable在(L1)中) 联盟 从Table1中选择不同的Lable,Tag,Value Lable = L3且Tag not in(从表1中选择不同的标签,其中为 Lable in(L1,L2))****