SQL服务器 - 在CASE WHEN查询上选择列条目

时间:2013-06-28 16:54:54

标签: sql sql-server case min case-when

我想在预订的数据库表(PROVIDER_ID)中找到第一个提供者(CLIENT_ID)到客户端(BOOKING_ID

我首先SELECT CLIENT_ID,然后计算其他各种事情。

我按(CLIENT_ID)分组并且计数正确。

我正在寻找的是

SELECT case when(min(BOOKING_ID)) then PROVIDER_ID else null end)

但我无法在SELECT/CASE WHEN

中执行子查询

我希望这是有道理的,问题很清楚。

理想情况下,我想要一个单一SELECT

内的解决方案

1 个答案:

答案 0 :(得分:1)

假设您想通过CLIENT_ID获取MIN(BOOKING_ID)分组的PROVIDER_ID,则以下内容应该有效:

SELECT  
    Client_ID,
    Booking_ID,
    Provider_ID
FROM (
    SELECT 
        Client_ID,
        Provider_ID,
        Booking_ID,
        ROW_NUMBER() OVER (PARTITION BY Client_ID ORDER BY Booking_ID) as RowNumber
    FROM
        Bookings
    ) OrderedTable
WHERE   
    OrderedTable.RowNumber = 1

它是如何工作的?如果结果集按特定字段排序,ROW_NUMBER OVER (ORDER BY field)会为您提供行号。 PARTITION BY field允许您通过特定键(在本例中为Client_ID)对表进行分区,该键将为每个Client_ID重置ROW_NUMBER(因此,如果RowNumber = 1,则它是该特定客户端的第一个条目)

此处有更多详情:http://msdn.microsoft.com/en-us/library/ms186734.aspx

使用WITH语法:

WITH OrderedTable AS
(
    SELECT 
        Client_ID,
        Provider_ID,
        Booking_ID,
        ROW_NUMBER() OVER (PARTITION BY Client_ID ORDER BY Booking_ID) as RowNumber
    FROM
        Bookings
) 
SELECT 
    Client_ID,
    Provider_ID,
    Booking_ID
FROM
    OrderedTable
WHERE
    RowNumber = 1