Новый запрос с учетом информации, добавленной в комментариях:
;WITH x(cardnum, dt, time_entry, time_exit) AS
(
SELECT cardnum, DATEDIFF(DAY, 0, eventime),
MIN(eventime), MAX(eventime)
FROM dbo.EVENTS
-- EDIT for more new requirements - for July 2011:
WHERE eventime >= '20110701'
AND eventime < '20110801'
GROUP BY cardnum, DATEDIFF(DAY, 0, eventime)
)
SELECT x.cardnum, e.lastname, x.time_entry, x.time_exit
FROM x INNER JOIN dbo.EMP AS e
ON x.cardnum = e.ID;
Вот как @Andriy предложил бы это:
SELECT ev.cardnum, e.lastname, MIN(ev.eventime), MAX(ev.eventime)
FROM dbo.EVENTS AS ev
INNER JOIN dbo.EMP AS e
ON ev.cardnum = e.ID
GROUP BY ev.cardnum, e.lastname, DATEDIFF(DAY, 0, ev.eventime);
Однако я нахожу это менее интуитивным. Хотя планы с таким небольшим размером данных практически идентичны (немного другое расположение агрегата потока, но я не уверен, насколько хуже будет работать оператор сортировки в большем масштабе, и я понятия не имею, какие индексы находятся в таблице), и Число символов @ Andriy, очевидно, ниже (317 символов против 204), его группировка семантически смешана с присоединением, и я не думаю, что все пользователи найдут интуитивно понятным видеть столбец GROUP BY
, который не находится список SELECT
. Конечно, это в основном субъективные причины.