Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изберете заявка изберете въз основа на приоритет

РАНГ , а не 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

Версия без 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
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

Получавам:

id   value_type  rank
----------------------
1    B           1
1    B           1
2    A           1
2    A           1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ефективност на индексиране BigInt срещу VarChar

  2. Грешка при отваряне на главния ключ на SQL Server 2008 при промяна на физическия сървър

  3. Какво представлява двоен в sql сървър?

  4. Как да използвате DataContext.ExecuteCommand и да получите върнатата стойност на изпълнената съхранена процедура?

  5. Уведомете моята WCF услуга, когато моята база данни се актуализира