Мне нужно сгенерировать сценарий SQL, который будет извлекать отдельные записи, используя ряд столбцов, один из которых является столбцом даты и времени. Меня интересует только первое вхождение дня для каждого события, и запрос должен охватывать несколько дней. Запрос будет выполняться к очень большой базе данных и потенциально может возвращать сотни тысяч результатов, если не миллионов. Поэтому мне нужно, чтобы этот скрипт был максимально эффективным. В конечном итоге это будет скрипт, работающий в SSRS для извлечения транзакций доступа.
Я пытался использовать GROUP BY, DISTINCT, подзапросы, FIRST и тому подобное, но безуспешно. Во всех примерах, которые я могу найти в Интернете, нет операторов JOIN или вычисляемых столбцов, например, только сбор даты из поля datetime.
Я упростил приведенный ниже сценарий, чтобы он потянул только один день и одну дверь, но результат будет несколько дней и дверей. Этот код возвращает данные, которые мне нужны, меня не волнует COUNT, но мне также нужно каким-то образом получить поле (DateAdd(minute,-(ServerLocaleOffset),ServerUTC))
в моем наборе результатов. Проблема в том, что если он идет ко второму, он делает все записи ОТЛИЧНЫМИ.
DECLARE @Begin datetime2 = '4/10/2019',
@End datetime2 = '4/11/2019',
@Door varchar(max) = 'Front Entrance'
SELECT
CONVERT(VARCHAR(10), (DateAdd(minute,-(ServerLocaleOffset),ServerUTC)),101) AS 'Date'
,AJ.PrimaryObjectIdentity
,AJ.SecondaryObjectIdentity
,AJ.MessageType
,AJ.PrimaryObjectName
,AJ.SecondaryObjectName
,AP.Text13
,COUNT(*) AS 'Count'
FROM Access.JournalLogView AJ
LEFT OUTER JOIN Access.Personnel as AP on AP.GUID = AJ.PrimaryObjectIdentity
WHERE (MessageType like 'CardAdmitted' OR MessageType like 'CardRejected')
AND (DateAdd(minute,-(ServerLocaleOffset),ServerUTC)) BETWEEN @Begin AND @End
AND (SecondaryObjectName IN (@Door))
GROUP BY CONVERT(VARCHAR(10), (DateAdd(minute,-(ServerLocaleOffset),ServerUTC)),101)
,PrimaryObjectIdentity
,SecondaryObjectIdentity
,MessageType
,PrimaryObjectName
,SecondaryObjectName
,Text13
ORDER BY AJ.PrimaryObjectName
Я хочу, чтобы столбцы были вызваны в операторе SELECT плюс дата и время, включая второе. Опять же, я также хочу наиболее эффективный способ получения этих данных. Большое спасибо.