我想在预订的数据库表(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
答案 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