根据优先级从列中选择值

har*_*rry 5 sql sql-server sql-server-2008

我有这样的桌子

AMID输入
------- ---------
1000火星
1001 JUPITER
1002土星
1003金星
1003土星
1004海王星
1004土星
1005 JUPITER
1005火星

现在,我要提取具有特定ENTRY值的DISTINCT AMID值。茶几应该是这样的

 AMID输入
-------- --------
  1000火星
  1001 JUPITER
  1002土星
  1003金星
  1004土星
  1005火星

选择ENTRY值的条件是,

它必须根据此优先级获取值:

  1. 金星
  2. 火星
  3. 木星
  4. 土星
  5. 海王星

因此,如果任何一个AMID同时具有金星和火星,则应采用金星
火星和土星,应采用火星
NEPTUNE和JUPITER,应采用JUPITER。(按优先级选择)。

Iva*_*n G 4

您可以使用排名函数来完成此操作(如果您使用的是 SQL Server 2008):

DECLARE @t TABLE (AMID INT, Entry VARCHAR(100))
INSERT @t 
VALUES
(       1000                   ,'MARS'),
(       1001                   ,'JUPITER'),
(       1002                   ,'SATURN'),
(       1003                   ,'VENUS'),
(       1003                   ,'SATURN'),
(       1004                   ,'NEPTUNE'),
(       1004                   ,'SATURN'),
(       1005                   ,'JUPITER'),
(       1005                   ,'MARS')

;WITH a AS(
    SELECT  *,
            ROW_NUMBER() OVER (PARTITION BY AMID ORDER BY 
                CASE Entry 
                    WHEN 'VENUS' THEN 0
                    WHEN 'MARS' THEN 1
                    WHEN 'JUPITER' THEN 2
                    WHEN 'SATURN' THEN 3
                    WHEN 'NEPTUNE' THEN 4
                END) num
    FROM    @t
)

SELECT  AMID, Entry
FROM    a
WHERE   num = 1
Run Code Online (Sandbox Code Playgroud)

  • 好答案。我为此创建了一个 sql fiddle 链接 http://sqlfiddle.com/#!3/d41d8/3207 (4认同)