Sql 基于优先级表消除重复记录
我有2个表,1个产品有以下数据Sql 基于优先级表消除重复记录,sql,sql-server,database,tsql,join,Sql,Sql Server,Database,Tsql,Join,我有2个表,1个产品有以下数据 orderName Skey 3.0 100 Pen 100 Scale 101 Pen 101 Bottle 102 orderName Priority Scale 1 Pen 2 Bottle 3 3.0 4 优先级表2有以下数据 ord
orderName Skey
3.0 100
Pen 100
Scale 101
Pen 101
Bottle 102
orderName Priority
Scale 1
Pen 2
Bottle 3
3.0 4
优先级表2有以下数据
orderName Skey
3.0 100
Pen 100
Scale 101
Pen 101
Bottle 102
orderName Priority
Scale 1
Pen 2
Bottle 3
3.0 4
我想根据优先级表中的订单优先级从产品表中删除重复的ValuesKey
输出是应该给出的
orderName Skey
Pen 100
Scale 101
Bottle 102
我不确定如何使用单个查询来实现这一点。
请帮助以下是一个完整的工作示例:
DECLARE @Products TABLE
(
[orderName] VARCHAR(24)
,[Skey] INT
);
DECLARE @priority TABLE
(
[orderName] VARCHAR(25)
,[Priority] TINYINT
);
INSERT INTO @Products ([orderName], [Skey])
VALUES ('3.0', 100)
,('Pen', 100)
,('Scale', 101)
,('Pen', 101)
,('Bottle', 102);
INSERT INTO @priority ([orderName], [Priority])
VALUES ('Scale', 1)
,('Pen', 2)
,('Bottle', 3)
,('3.0', 4);
SELECT TOP 1 WITH TIES P.[orderName], P.[Skey]
FROM @Products P
INNER JOIN @priority PR
ON P.[orderName] = PR.[orderName]
ORDER BY ROW_NUMBER() OVER (PARTITION BY P.[Skey] ORDER BY PR.[Priority]);
cte作为精选产品。*,
按Skey划分的行数
按优先级排序
优先权
其中Product.orderName=priority.orderName-rn
从产品
删去
来自cte
其中rn>1;
优先级表中的PS.orderName列必须定义为唯一。优先级列也需要唯一性。使用按键分区1按键排序2以按分区排序数据。然后从每个分区中选择第一项。代码来了
create table Product(orderName varchar(100),Skey int);
insert into Product values('3.0',100);
insert into Product values('Pen',100);
insert into Product values('Scale',101);
insert into Product values('Pen',101);
insert into Product values('Bottle',102);
create table Priority(orderName varchar(100),Priority int);
insert into Priority values('Scale',1);
insert into Priority values('Pen',2);
insert into Priority values('Bottle',3);
insert into Priority values('3.0',4);
select orderName,skey FROM
(
select p.orderName,skey,pr.Priority,row_number() over(partition by skey order by pr.Priority) as rowNum
from Product p join Priority pr on p.orderName=pr.orderName
) t where t.rowNum = 1
OP需要删除重复值,而不是选择。