SQL Server:根据另一列特定搜索进行选择

时间:2014-07-24 13:36:10

标签: sql-server

嗨目前,我正面临着超出我范围的关键问题。你的帮助很高。

以下是我的表结构:

-----------------------------
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,(因为它是最高优先级)

2 个答案:

答案 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 

未经测试,但试试这个。它为此分配优先级和订单,以便仅为您提供最高优先级。