Мой запрос работает, но мне нужно сделать масштабируемым.Мне нужно удалить союзы, но не знаю, как поступить - PullRequest
2 голосов
/ 18 сентября 2019

Мне нужен список того, сколько раз файл обрабатывался через нашу систему.Например, на неделе 1 для заданного идентификатора хранилища x количество файлов обработано 1 раз, x число обработано 2 раза и т. Д.Я написал запрос, который использует временную таблицу и несколько объединений, но он не масштабируется.Например, если файл обрабатывается 42 раза, запрос в его текущей форме будет абсурдно длинным.Я думаю, что мне нужно несколько самостоятельных присоединений, может быть?Или подзапросы?Но мне очень тяжело разобраться со следующим шагом.

В настоящее время я складываю все это в заявлениях профсоюзов.Ответ правильный и точный.Но моя цель - сделать его масштабируемым и не полагаться на жесткое кодирование.Я попытался переписать с использованием count (*)> 1, но это просто возвращает нас к жесткому кодированию и использованию союзов.Должен быть более динамичный способ.

Drop table If exists #a; 
select FileMasterID, datepart(ww, complete_dttm) AS WeekNum, count(1) as TimesProcessed, whid
INTO #a
from Reporting.Log
where Complete_dttm > '2018-12-31'
Group By FileMasterID, datepart(ww, complete_dttm), whid;

/*
This is the reporting output of the query to answer how many files have been processed once, twice and so on.
*/

select whid, COUNT(1) AS FileCount, 'Processed 1 time' AS PT from #a where TimesProcessed=1 GROUP BY whid UNION ALL
select whid, COUNT(1) AS FileCount, 'Processed 2 times' AS PT from #a where TimesProcessed=2 GROUP BY whid UNION ALL
select whid, COUNT(1) AS FileCount, 'Processed 3 times' AS PT from #a where TimesProcessed=3 GROUP BY whid UNION ALL
select whid, COUNT(1) AS FileCount, 'Processed 4 times' AS PT from #a where TimesProcessed=4 GROUP BY whid UNION ALL
select whid, COUNT(1) AS FileCount, 'Processed 5 times' AS PT from #a where TimesProcessed=5 GROUP BY whid UNION ALL
select whid, COUNT(1) AS FileCount, 'Processed 6 times' AS PT from #a where TimesProcessed=6 GROUP BY whid 
Order by whid,  PT

Поиск количества файлов, обработанных 1 раз, 2 раза, 3 раза и т. Д.

whid    FileCount   PT
1       82108       Processed 1 time
1       3203        Processed 2 times
1       78          Processed 3 times
1       13          Processed 4 times
2       78702       Processed 1 time
2       1209        Processed 2 times

1 Ответ

1 голос
/ 19 сентября 2019

Вы, похоже, ищете простой агрегированный запрос.Точный синтаксис может немного измениться в зависимости от вашей СУБД (а именно, поддерживает ли она псевдонимы в предложении GROUP BY или нет), но он должен выглядеть следующим образом:

SELECT
    whid,
    COUNT(*) FileCount,
    CONCAT('Processed ', TimesProcessed, ' time(s)') PT
FROM #a
GROUP BY whid, PT
-- OR : GROUP BY whid, CONCAT('Processed ', TimesProcessed, ' time(s)')

Если вы хотите ограничить запрос доконкретный список TimesProcessed значений, вы можете добавить WHERE предложение:

SELECT
    whid,
    COUNT(*) FileCount,
    CONCAT('Processed ', TimesProcessed, ' time(s)') PT
FROM #a
WHERE TimesProcessed IN (1, 2, 4, 5, 6) -- or some other condition
GROUP BY whid, PT
...