嗨目前,我正面临着超出我范围的关键问题。你的帮助很高。
以下是我的表结构:
-----------------------------
num name
1 Test
1 Test1
1 Test2
2 Test1
2 Test2
----------------------------
条件实际上名称是我的设置:{'测试','测试1','测试2'}
如果我获得具有不同名称值的多个记录,我只需要显示一条记录。
条件:测试是最高优先级test1是第二个,test2是最低优先级。
从上表中只需要获得一条记录
1 Test
1 Test1
1 Test2
------------
1 test
因为在多个记录中,测试已经存在。
以及从剩余的2条记录中我只需要获得1条记录;即2 test1因为test1是最高优先级
2 Test1
2 Test2
任何人都请帮忙。
更清晰的样本,并以这种方式尝试 示例数据如下所示。我尝试了下面的过程,但没有成功。
GlobalID SECURITY_TYP
1 COMMON STOCK
1 REIT
1 Closed-End Fund
2 Closed-End Fund
3 REIT
3 Closed-End Fund
4 Closed-End Fund
4 REIT
优先顺序:{' COMMON STOCK',' REIT','封闭式基金'};
我需要出局:
GlobalID SECURITY_TYP
1普通股 2封闭式基金 3封闭式基金 4 REIT
我尝试了以下过程。
SELECT *
FROM (
SELECT temptest.*
,ROW_NUMBER() OVER (PARTITION BY globalid order by globalid ) AS RN
FROM temptest
) AS t
--where rn=1
WHERE rn=1
and output of the query is :
GlobalID SECURITY_TYP RN
1 COMMON STOCK 1
2 Closed-End Fund 1
3 REIT 1
4 Closed-End Fund 1
但是对于全局ID 4,我需要获得REIT,(因为它是最高优先级)
答案 0 :(得分:0)
这对你有用吗?我在第一个结果集中添加了一个列优先级 - 根据你所描述的,这可以很容易地获得,这取决于它是否是普通股等。当我分区时,我是基于这个值进行排序。
DECLARE @test TABLE
(
id Int IDENTITY(1, 1)
,num Int
,name Varchar(50)
,[priority] int
)
INSERT INTO @test
SELECT 1
,'Test'
,1
INSERT INTO @test
SELECT 1
,'Test1'
,2
INSERT INTO @test
SELECT 1
,'Test2'
,1
INSERT INTO @test
SELECT 2
,'Test1'
,3
INSERT INTO @test
SELECT 2
,'Test2'
,2
select * from @test
SELECT *
FROM (
SELECT *
,ROW_NUMBER() OVER (PARTITION BY num ORDER BY priority) AS RN
FROM @test
) AS t
where rn=1
答案 1 :(得分:0)
SELECT GlobalID
,SECURITY_TYP
,CASE SECURITY_TYP
WHEN 'COMMON STOCK' THEN 1
WHEN 'REIT' THEN 2
WHEN 'Closed-End Fund' THEN 3
ELSE 999 --doesn't match
END [Priority]
INTO #tmp
FROM temptest
SELECT *
FROM (
SELECT t.*
,ROW_NUMBER() OVER (PARTITION BY globalid order by Priority) AS RN
FROM #tmp t
) AS t1
WHERE rn=1
未经测试,但试试这个。它为此分配优先级和订单,以便仅为您提供最高优先级。