T-sql查询根据优先级从多个记录中进行选择

时间:2013-12-02 09:30:38

标签: sql-server tsql select

我有fruits表,参考国家/地区。我需要查询表并显示查询结果。

Query result

如果表中多次出现水果,即来自多个国家/地区,则只显示来自一个国家/地区的结果。此外,记录应根据国家的优先顺序选择,如下:新加坡(最优先),马来西亚,印度尼西亚。

我该如何查询?

结果应该是这样的:

Desired query result

1 个答案:

答案 0 :(得分:4)

听起来你需要一个额外的表来保存国家的优先级值。 然后你可以按这个值排序。 将它与ROW_NUMBER语句和递归逻辑相结合,以获得所需的结果。

你最终会得到这样的东西:

--Sample data
DECLARE @fruit AS TABLE ([Type] VARCHAR(50), Country VARCHAR(50), Price DECIMAL(5,2))
DECLARE @country_priority AS TABLE (Country VARCHAR(50), [Priority] INT)
INSERT INTO @country_priority VALUES ('Singapore',3)
INSERT INTO @country_priority VALUES ('Malaysia',2)
INSERT INTO @country_priority VALUES ('Indonesia',1)

INSERT INTO @fruit VALUES ('Orange','Malaysia',25)
INSERT INTO @fruit VALUES ('Orange','Singapore',30)
INSERT INTO @fruit VALUES ('Orange','Indonesia',28)
INSERT INTO @fruit VALUES ('Apple','Malaysia',65)
INSERT INTO @fruit VALUES ('Apple','Singapore',55)
INSERT INTO @fruit VALUES ('Banana','Indonesia',88)
INSERT INTO @fruit VALUES ('Durian','Malaysia',77)
INSERT INTO @fruit VALUES ('Pineapple','Indonesia',15)

--query
;WITH summary AS (
SELECT f.[Type], 
       f.Country, 
       f.Price, 
       ROW_NUMBER() OVER(PARTITION BY f.[Type] 
                             ORDER BY cp.[Priority] DESC) AS rank
FROM @fruit f
INNER JOIN @country_priority cp
    ON f.Country = cp.Country)
SELECT s.*
FROM summary s
WHERE s.rank = 1

--results
Type        Country     Price   rank 
Apple       Singapore   55.00   1 
Banana      Indonesia   88.00   1 
Durian      Malaysia    77.00   1
Orange      Singapore   30.00   1 
Pineapple   Indonesia   15.00   1

注意:上面的连接基于varchar列,所以我可以快速举例说明。请根据您的需要选择合适的类型。这是一个很好的thread供您查看。