我需要找出最好的方法来做到这一点 - 这是一个例子。假设您要拨打 England: 并且您要拨打的号码是: 447400123456 。现在您可以使用三个不同的长途提供商,但它们都有不同的费率。有一个像这样的 LD 费率表:

VendorID    Dialcode    Description             Rate
------------------------------------------------------
1           44          UK - All                0.01
1           447         UK - Mobile             0.02
2           44          UK - All                0.015
3           44          UK - All                0.013
3           44740       UK - Mobile - Hutch     0.01

我需要一个可以匹配并返回每个供应商电话号码的最大数字的查询 - 因此对于上面的数字,它应该返回:
VendorID    Dialcode    Description             Rate
------------------------------------------------------
1           447         UK - Mobile             0.02
2           44          UK - All                0.015
3           44740       UK - Mobile - Hutch     0.01

我希望除了用循环缩小数字之外,还有其他可以做的事情。另外,如果表上应该有一个索引来加快处理速度 - 你有什么建议?

最佳答案

您可以使用 ROW_NUMBER() OVER(PARTITION BY VendorID ORDER BY LEN(DialCode) 获取每个 VendorID 的最大位数:

SQL Fiddle

DECLARE @telNo VARCHAR(50) = '447400123456';
WITH Cte AS(
    SELECT *,
        RN = ROW_NUMBER() OVER(PARTITION BY VendorID ORDER BY LEN(DialCode) DESC)
    FROM tbl
    WHERE @telNo LIKE DialCode + '%'
)
SELECT
    VendorID, DialCode, Description, Rate
FROM Cte
WHERE RN = 1

结果 :
| VendorID | DialCode |         Description |  Rate |
|----------|----------|---------------------|-------|
|        1 |      447 |         UK - Mobile |  0.02 |
|        2 |       44 |            UK - All | 0.015 |
|        3 |    44740 | UK - Mobile - Hutch |  0.01 |

关于sql - 如何根据电话号码找到长途费率的最佳匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31778141/

10-15 19:54