Я пытаюсь найти способ вернуть набор записей с динамическим количеством столбцов. Я могу написать один запрос, который создаст список имен столбцов, которые мне нужны как таковые:
SELECT DISTINCT name FROM tests WHERE group = 'basic';
Это вернет короткий список, такой как «poke», «prod», «hit», «drop» и т. д. Затем я хочу создать таблицу, показывающую серию тестов, в которых выполнялся каждый из этих тестов. Каждое утро мы смотрим на то, что делают разработчики, и проверяем и подталкиваем к этому, чтобы каждый тест выполнялся каждый день. Этот запрос я могу написать статически:
SELECT (SELECT success FROM test_results AS i
WHERE i.name = 'poke'
AND i.date = o.date) AS 'poke',
(SELECT success FROM test_results AS i
WHERE i.name = 'prod'
AND i.date = o.date) AS 'prod',
...
FROM test_results AS o GROUP BY date
HAVING date > now() - '1 week'::interval;
Однако это жестко запрограммировано для тестов, которые мы проводим каждый день. Если нам теперь нужно каждый день пинать устройство, нужно обновить запрос. Если мы решим, что тест на падение больше не нужен, через неделю столбец теста на падение должен исчезнуть из отчета, поскольку он больше не встречается в результатах. Возврат NULL для отсутствующих тестов, когда только определенные даты имеют запись результатов, вполне допустимо.
Есть ли способ создать динамический список столбцов из результатов, просто используя обычный SQL в запросе?
Я пытался создать данные, которые мне нужны, по частям, используя запрос WITH
, но я не могу найти способ правильно построить последнюю строку из динамической информации.
Изменить. Вот пример данных за последние два дня:
CREATE TABLE test_results (
name TEXT NOT NULL,
date DATE default now() NOT NULL,
success BOOLEAN NOT NULL
);
INSERT INTO test_results (name, date, success) VALUES ('hit', '2017-06-20', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('poke', '2017-06-20', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('prod', '2017-06-20', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('poke', '2017-06-21', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('prod', '2017-06-21', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('poke', '2017-06-22', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('prod', '2017-06-22', FALSE);
INSERT INTO test_results (name, date, success) VALUES ('poke', '2017-06-23', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('prod', '2017-06-23', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('drop', '2017-06-23', TRUE);
Если я выполню свой запрос для диапазона данных с 21.06.2017 по 23.06.2017, я хотел бы получить такие результаты, как следующие, включая матрицу любых тестов, которые были выполнены за это время:
date | poke | prod | drop
------------+--------+--------+-----
2017-06-21 | TRUE | TRUE | NULL
2017-06-22 | TRUE | FALSE | NULL
2017-06-23 | TRUE | TRUE | TRUE
Названия poke, prod и drop были именами, найденными в поле имени строки в течение этого периода времени. NULL возвращается для подробного запроса для любых тестов, которые не имеют записи на эту дату.