Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chọn truy vấn chọn dựa trên mức độ ưu tiên

RANK , chứ không phải ROW_NUMBER, vì bạn muốn các mối quan hệ (những mối quan hệ có cùng giá trị B) có cùng giá trị xếp hạng:

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

Phiên bản không phải 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

Tôi nhận được:

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. Cách xác định giá trị trường không thể chuyển đổi thành (thập phân, float, int) trong SQL Server

  2. TSQL truy cập độc quyền lẫn nhau trong một thủ tục được lưu trữ

  3. Thay đổi kiểu dữ liệu varchar thành nvarchar trong cơ sở dữ liệu SQL Server 2005 hiện có. Có vấn đề gì không?

  4. Không thể tìm thấy cơ sở dữ liệu đầu tiên về mã EF của tôi

  5. SQL Chọn giá trị bên trong dấu ngoặc đơn