Строки, которые появились только один раз в результатах запроса - PullRequest
0 голосов
/ 04 июня 2018

Я хочу иметь строки, которые появились 25 февраля, а не 6 марта.Я пытался сделать такой запрос:

SELECT favfd.day, dv.title, array_to_string(array_agg(distinct "host_name"), ',') AS affected_hosts , htmltoText(dsol.fix),
count(dv.title) FROM fact_asset_vulnerability_finding_date favfd
INNER JOIN dim_vulnerability dv USING(vulnerability_id)
INNER JOIN dim_asset USING(asset_id)
INNER JOIN dim_vulnerability_solution USING(vulnerability_id)
INNER JOIN dim_solution dsol USING(solution_id)
INNER JOIN dim_solution_highest_supercedence dshs USING (solution_id)
WHERE (favfd.day='2018-02-25' OR favfd.day='2018-03-06') AND 
dsol.solution_type='PATCH' AND dshs.solution_id=dshs.superceding_solution_id
GROUP BY favfd.day, dv.title, host_name, dsol.fix
ORDER BY favfd.day, dv.title

, который дал мне следующие результаты: результаты

Я прочитал, что мне нужно добавить что-то вроде "HAVINGCOUNT (*) = 1 "но, как вы можете видеть в результатах запроса, мои столбцы подсчета выглядят довольно странно.Вот мои результаты с добавленной строкой: результаты с

Можете ли вы посоветовать мне, что я делаю неправильно?

1 Ответ

0 голосов
/ 04 июня 2018

Одним из способов является использование предложения HAVING для утверждения ваших критериев даты:

SELECT
    dv.title,
    array_to_string(array_agg(distinct "host_name"), ',') AS affected_hosts,
    htmltoText(dsol.fix),
    count(dv.title)
FROM fact_asset_vulnerability_finding_date favfd
INNER JOIN dim_vulnerability dv USING(vulnerability_id)
INNER JOIN dim_asset USING(asset_id)
INNER JOIN dim_vulnerability_solution USING(vulnerability_id)
INNER JOIN dim_solution dsol USING(solution_id)
INNER JOIN dim_solution_highest_supercedence dshs USING (solution_id)
WHERE
    dsol.solution_type = 'PATCH' AND
    dshs.solution_id = dshs.superceding_solution_id
GROUP BY dv.title, dsol.fix
HAVING
    SUM(CASE WHEN favfd.day = '2018-02-25' THEN 1 ELSE 0 END) > 0 AND
    SUM(CASE WHEN favfd.day = '2018-03-06' THEN 1 ELSE 0 END) = 0
ORDER BY favfd.day, dv.title

Единственными существенными изменениями, которые я сделал, было удаление host_name из предложения GROUP BY, поскольку вы используетеэтот столбец в совокупности, в предложении выбора.И я добавил предложение HAVING, чтобы проверить вашу логику.

Изменение, которое вы должны сделать, - заменить синтаксис неявного соединения на явное соединение.Включение критериев соединения в предложение WHERE в настоящее время считается плохой практикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...