2013-06-28 14 views
1

我想预订的数据库表(BOOKING_IDSQL服务器 - 选择的情况下的列条目时查询

找出第一提供商(PROVIDER_ID)客户端(CLIENT_ID)我目前SELECT首先是CLIENT_ID,然后计算其他各种东西。 (CLIENT_ID),计数是正确的。

我正在寻找的是

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

但我无法内SELECT/CASE WHEN

我希望这是有道理的,问题是清楚的方式进行子查询。

理想情况下,我想一个解决方案,是在一个单一的SELECT

回答

1

假设你想要得到的MIN(BOOKING_ID)的PROVIDER_ID通过CLIENT_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)将重置ROW_NUMBER每个CLIENT_ID(所以如果ROWNUMBER = 1,它是为特定客户端的第一个条目)

更多细节在这里: http://msdn.microsoft.com/en-us/library/ms186734.aspx

使用语法:

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 
+0

嗨肖恩,这是梦幻般的。我很高兴。对于有同样问题的其他人,我会在第二个选择中使用名称标题(在我的情况b中)发生错误 - 这会导致错误 - 也要感谢链接 - 将来证明在将来非常有用 – finngeraghty

+0

很高兴我可以帮助:) –