Я считаю, что ваши запросы могут быть упрощены в одном простом утверждении с помощью условного агрегирования .
Рассмотрим:
SELECT
clientid,
MIN(calendar) as mincal
MIN(CASE WHEN calls = 0 AND calendar < getdate()-2 THEN calendar END) as callzero,
DATEDIFF(
DAY,
MIN(CASE WHEN calls = 0 AND calendar < getdate()-2 THEN calendar END),
MIN(calendar)
) as date_interval
FROM (
SELECT
clientid,
CONVERT(datetime, convert(varchar(10), calendar)) calendar
FROM STATS
)
GROUP BY clientid
Примечания:
Я понимаю, что даты в CALENDAR
хранятся как целые числа, отсюда и двойное преобразование. Чтобы ограничить количество конверсий, я переместил его в подзапрос.
В третьем столбце учитываются только строки, имеющие calls = 0
и calendar
в течение последних двух дней; для других строк оператор CASE
возвращает NULL
, который в основном игнорируется агрегатной функцией MIN
.
в sql-server, DATE_DIFF
можно использовать для вычитания дат (здесь запрос возвращает количество дней между двумя вычисленными датами)