Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wybierz zapytanie wybierz na podstawie priorytetu

RANKING , a nie ROW_NUMBER, ponieważ chcesz, aby powiązania (z tą samą wartością B) miały tę samą wartość rankingu:

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

Wersja bez 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

otrzymuję:

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. SQL Server CTE i przykład rekurencji

  2. Usuń SCHEMABINDING z widoku w SQL Server

  3. Jak napisać zapytanie za pomocą self join na tabeli z ogromnymi danymi?

  4. Uzyskaj Root rodzica dziecka w tabeli hierarchicznej

  5. SQL MAX wielu kolumn?