Я уже давно бьюсь об этом, и думаю, что сейчас я сильно усложнил ситуацию.У меня есть таблица, содержащая поля
- OpenDate
- ClosedDate
- Клиент
- Контракт
- Сервис
Что мне нужно, чтобы превратить это в
- Дата
- Клиент
- Контракт
- Сервис
- OpenedOnThisDay
- OpenedYeterday
- ClosedOnThisDay
- ClosedYesterday
- OpenAtStartOfTuture
- OpenAtStartOfToday
1038 *1037* 1038, могут быть или не быть какие-либо вопросы, открытые или закрытые в этот день.Этот день все еще должен быть включен с 0
Я пришел к этому несколькими способами и могу дать один из желаемых результатов за раз (открыт, закрыт, открыт в конце), но я не могуполучить их все сразу, по крайней мере, без экспоненциального увеличения времени запроса.
Мои запросы в настоящее время в виде представлений выглядят следующим образом
Открыт
select Cast(EntryDateTime as Date) as DateStamp
,ContractNumber
,Client
,services.Service
,sum(1) as Count
,lag(sum(1)) OVER (
partition by tickets.ContractNumber
,services.Service ORDER BY Cast(EntryDateTime as Date) ASC
) as CountDayBefore
from v_JiraImpactedServices as services
LEFT JOIN v_JiraTickets as tickets ON services.ticketnumber = tickets.TicketNumber
WHERE tickets.Client is not null
AND tickets.TicketNumber IS NOT NULL
and tickets.ContractNumber is not null
GROUP BY Cast(tickets.EntryDateTime as Date)
,tickets.ContractNumber
,tickets.Client
,services.Service;
Закрыт
select Cast(ResolvedDateTime as Date) as DateStamp
,ContractNumber
,Client
,services.Service
,sum(1) as Count
,lag(sum(1)) OVER (
partition by tickets.ContractNumber
,services.Service ORDER BY Cast(ResolvedDateTime as Date) ASC
) as CountDayBefore
from v_JiraImpactedServices as services
LEFT JOIN v_JiraTickets as tickets ON services.ticketnumber = tickets.TicketNumber
WHERE tickets.Client is not null
and tickets.TicketNumber is not null
AND tickets.ContractNumber is not null
GROUP BY Cast(tickets.ResolvedDateTime as Date)
,tickets.ContractNumber
,tickets.Client
,services.Service;
Открыто Вкл.
SELECT calendar.FullDate as DateStamp
,tickets.ContractNumber
,tickets.client
,services.Service
,IsNull(count(tickets.TicketNumber), 0) as Count
,IsNull(lag(count(tickets.TicketNumber), 1) OVER (
partition by tickets.ContractNumber
,services.Service Order By FullDate ASC
), 0) as CountDayBefore
FROM v_Calendar as calendar
LEFT JOIN v_JiraTickets as tickets ON Cast(tickets.EntryDateTime as Date) <= calendar.FullDate
AND (
Cast(tickets.ResolvedDateTime as Date) > calendar.FullDate
OR tickets.ResolvedDateTime is null
)
LEFT JOIN v_JiraImpactedServices as services ON services.ticketnumber = tickets.TicketNumber
WHERE tickets.Client is not null
AND tickets.ContractNumber is not null
GROUP BY calendar.FullDate
,tickets.ContractNumber
,tickets.Client
,services.Service;
Как я уже говорил, каждый из них сам по себе дает ПОЧТИ желаемые результаты, но пропускает дни со значениями 0.
Помимо дней производствас 0 значениями мне нужно также объединить их в один результат таблицы.Все попытки до настоящего времени либо приводили к явно неверным результатам JOIN, либо выполнялись в течение часа.
Я был бы очень признателен, если бы кто-то указал мне правильное направление здесь.