SQL, использующий 5 лучших результатов в качестве фильтра

#sql #filter #subquery #common-table-expression

Вопрос:

Мне нужно выяснить механизм SQL для использования 5 категорий, которые я рассчитал с помощью CTE, чтобы иметь возможность фильтровать мои общие результаты. Когда я «соединяю» с запятой: из таблицы,cte результаты умножаются. На самом деле у меня нет поля для правильного объединения из-за вычисления количества в cte.

Я чувствую, что это должен быть подзапрос в операторе where, но у меня есть 5 результатов, и я думаю, что это работает только с 1 результатом.

Я пробовал (в меру своих возможностей) cte, различные подзапросы, наличие, существует

Рабочий CTE:

 DECLARE @END VARCHAR(25)='2021-04-04 23:59:59.000'  --Sunday

DECLARE @START DATEtime = DATEADD(DD,-364,@END)

;With CTE as (

Select Top 5

          TIER_3 

         ,COUNT(INCIDENT_NUMBER) AS CTE_Count    

    FROM vIncidentTickets

   WHERE LAST_RESOLVED_DATE between @START and @END

     AND GROUP = 'Cell'

     AND COMPANY = 'HQ'

     AND ORGANIZATION = 'CSS'

GROUP BY TIER_3

ORDER BY COUNT(INCIDENT_NUMBER) DESC
)
 

—Выбранная часть не дает правильных результатов

 Select    
          INCIDENT_NUMBER

         ,CTE.TIER_3 

    FROM vIncidentTickets,CTE

   WHERE LAST_RESOLVED_DATE between @START and @END

     AND GROUP = 'Cell'

     AND COMPANY = 'HQ'

     AND ORGANIZATION = 'CSS'
 

Я хочу, чтобы результаты CTE фильтровали запрос Select.

Ответ №1:

НЕ присоединяйтесь, используя запятую. Стандарту использования JOIN ключевых слов почти 30 лет, привыкайте к нему и используйте его.

При использовании INNER JOIN , в частности, становится ясно, что вы не включили никаких условий для связи двух таблиц (без предиката соединения).

Попробуйте вместо этого вот это…

 Select    
      v.INCIDENT_NUMBER
     ,CTE.TIER_3 
FROM
    vIncidentTickets   AS v
INNER JOIN
    CTE
        ON CTE.TIER_3 = v.TIER_3
WHERE
     v.LAST_RESOLVED_DATE between @START and @END
 AND v.GROUP = 'Cell'
 AND v.COMPANY = 'HQ'
 AND v.ORGANIZATION = 'CSS'
 

(Ваш исходный запрос был эффективно использован CROSS JOIN .)