#sql #tsql #sql-server-2017
Вопрос:
Я хочу создать подзапрос, чтобы избежать использования временной таблицы. Прямо сейчас у меня есть:
select id,COUNT (id)as Attempts
into #tmp
from Table1
where State in ('SD')
and Date >= cast( GETDATE() -7 as date )
group by Accountid having COUNT (accountid) > 2
select *
from #tmp a join Table1 b on a.id= b.id
and b.Date >= cast( GETDATE() -7 as date )
where CAST(Date as date) = cast(GETDATE()-1 as date)
order by a.id,b.Date
Есть ли способ получить этот результат всего за один запрос?
Комментарии:
1. Что ты пытаешься сделать? Пожалуйста, предоставьте примерные данные, желаемые результаты и четкое объяснение. Возможно, существует более простой подход.
2. Есть ли для этого какая-то конкретная причина? Очень часто добавление временной таблицы (она же «разделяй и властвуй») является более эффективным вариантом по множеству причин.
3. Причина, по которой я хотел пропустить использование временной таблицы, заключается в том, что это не работает в Power BI. Единственный способ заставить его работать-это использовать подзапрос, как показано ниже.
4. Хорошо, это оправданная причина 🙂
5. Обратите внимание, что
CAST(Date as date) = cast(GETDATE()-1 as date)
это неправильно оплачивается.Date >= CAST(DATEADD(day, -1, GETDATE()) AS date) AND Date < CAST(GETDATE() AS date)
вероятно, более эффективно
Ответ №1:
Замените #tmp
во втором запросе первый запрос, заключенный в скобки, как в:
select *
from (
select id,COUNT (id) as Attempts
from Table1
where State in ('SD')
and Date >= cast( GETDATE() -7 as date )
group by Accountid having COUNT (accountid) > 2
) a join Table1 b on a.id= b.id
and b.Date >= cast( GETDATE() -7 as date )
where CAST(Date as date) = cast(GETDATE()-1 as date)
order by a.id,b.Date
Первый запрос становится «табличным выражением».