根据优先级选择查询选择

kra*_*626 2 sql t-sql sql-server sql-server-2005

有人请更改我的标题,以更好地反映我想问的问题.

我有一张桌子

Table (id, value, value_type, data)
Run Code Online (Sandbox Code Playgroud)

ID不是唯一的.没有唯一的钥匙.

value_type 有两个可能的值,比方说A和B.

B型优于A,但通常不可用.

对于每个id,如果存在value_type B的任何记录,我希望所有具有该id和value_type B的记录.

如果没有带有value_Type B的id的记录,我想要所有具有该id和value_type A的记录.

请注意,如果B存在该ID,我不希望记录类型为A.

我目前使用一系列临时表来完成此操作.是否有一个可以完成工作的select语句(子查询OK)?

非常感谢!

额外细节:

SQL Server 2005

OMG*_*ies 5

RANK,而不是ROW_NUMBER,因为你想要关系(具有相同B值的关系)具有相同的排名值:

WITH summary AS (
  SELECT t.*,
         RANK() OVER (PARTITION BY t.id 
                          ORDER BY t.value_type DESC) AS rank
    FROM TABLE t
   WHERE t.value_type IN ('A', 'B'))
SELECT s.id,
       s.value,
       s.value_type,
       s.data
  FROM summary s
 WHERE s.rank = 1
Run Code Online (Sandbox Code Playgroud)

非CTE版本:

SELECT s.id,
       s.value,
       s.value_type,
       s.data
  FROM (SELECT t.*,
               RANK() OVER (PARTITION BY t.id 
                                ORDER BY t.value_type DESC) AS rank
          FROM TABLE t
         WHERE t.value_type IN ('A', 'B')) s
 WHERE s.rank = 1
Run Code Online (Sandbox Code Playgroud)
WITH test AS (
   SELECT 1 AS id, 'B' AS value_type
   UNION ALL
   SELECT 1, 'B'
   UNION ALL
   SELECT 1, 'A'
   UNION ALL
   SELECT 2, 'A'
   UNION ALL
   SELECT 2, 'A'),
     summary AS (
   SELECT t.*,
          RANK() OVER (PARTITION BY t.id 
                           ORDER BY t.value_type DESC) AS rank
     FROM test t)
SELECT *
  FROM summary
 WHERE rank = 1
Run Code Online (Sandbox Code Playgroud)

我明白了:

id   value_type  rank
----------------------
1    B           1
1    B           1
2    A           1
2    A           1
Run Code Online (Sandbox Code Playgroud)