Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pilih kueri pilih berdasarkan prioritas

RANK , daripada ROW_NUMBER, karena Anda ingin ikatan (yang memiliki nilai B yang sama) memiliki nilai peringkat yang sama:

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

Versi non-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

Saya mendapatkan:

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. Mengelompokkan total pengguna aktif untuk masing-masing dari 8 minggu sebelumnya

  2. Meniru group_concat() dikombinasikan dengan GROUP BY

  3. Lingkup Atur jumlah baris dalam SQL

  4. SQL Express untuk produksi?

  5. Tidak dapat membuat baris berukuran 8064 yang lebih besar dari ukuran baris yang diizinkan yaitu 8060