具有最高优先级的SQLrange查询

时间:2017-06-19 10:37:22

标签: sql sql-server sql-server-2008

在下面的查询中需要帮助,考虑到我的桌子上的以下内容,称为'tbProduct'。

CCY COUNTRY_CODE    FX_RATE
EUR      SG          0.80
USD      UK          0.50
USD      US          1.00
USD      SG          0.60
GBP      UK          1.00
GBP      SG          1.40

SQL上面的表格;

CREATE TABLE tbProduct
    ([CCY] varchar(8), [COUNTRY_CODE] varchar(8), [FX_RATE] varchar(8))
;

INSERT INTO tbProduct
    ([CCY], [COUNTRY_CODE], [FX_RATE])
VALUES
    ('EUR', 'SG', '0.80'),
    ('USD', 'UK', '0.50'),
    ('USD', 'US', '1.00'),
    ('USD', 'SG', '0.60'),
    ('GBP', 'UK', '1.00'),
    ('GBP', 'SG', '1.40')
;

我需要根据分配给国家/地区代码的优先级,从上表中获得每种货币的一个外汇汇率;我得到的想法是选择对应于每种货币具有最高优先级的国家/地区的汇率。例如,在这种情况下的优先级;

US > 1, UK > 2, SG > 3

理想情况下,我正在寻找SQL查询来提供以下预期结果。

CCY COUNTRY_CODE    FX_RATE
EUR     SG           0.80
USD     US           1.00
GBP     UK           1.00

这是我的fiddle

有人能告诉我如何获得预期的结果吗?因为我对如何尝试这一点感到困惑。

由于

2 个答案:

答案 0 :(得分:4)

您可以在ROW_NUMBER子句中使用CASE ORDER BY表达式来优先处理:

;WITH CTE AS (
   SELECT CCY, COUNTRY_CODE, FX_RATE,
          ROW_NUMBER() OVER (PARTITION BY CCY 
                             ORDER BY CASE COUNTRY_CODE
                                         WHEN 'US' THEN 1
                                         WHEN 'UK' THEN 2
                                         WHEN 'SG' THEN 3
                                      END) AS rn
   FROM tbProduct
)
SELECT *
FROM CTE
WHERE rn = 1

Demo here

答案 1 :(得分:1)

您可以创建优先级表并使用ROW_NUMBERTOP 1 WITH TIES

Declare @Priority as Table
(
    [COUNTRY_CODE] varchar(10),
    Priority int    
)

Insert Into @Priority VALUES ('US', 1), ('UK', 2),('SG', 3)


select TOP (1) WITH TIES 
       tp.* 
from tbProduct tp
Inner join @Priority p on tp.[COUNTRY_CODE] = p.[COUNTRY_CODE]
Order by row_number() over(partition by tp.CCY ORDER BY p.Priority)

演示链接:http://rextester.com/JDN95847