2016-09-14 2 views
0

У меня есть таблица PostgreSQL, в которой хранятся атрибуты разных физических объектов. Она имеет следующие поля:Создать широкий вид таблицы базы данных в PostgreSQL

object_name 
attr_name (string e.g. attr_1, attr_2 etc.) 
attr_value (number) 
date_modified (date) 
priority (integer) 

Там может быть много различных значений для одной и той же attr_name, которые будут добавлены в разное время и с разным уровнем приоритета (представляющего точность источника), так что мне нужна эта структура для прослеживаемости позже.

Я хотел бы создать представление этой таблицы, чтобы я мог эффективно его обработать для нескольких (~ 100) атрибутов, например.

SELECT * FROM View1 WHERE attr_1 = 5 and attr_2 > 3 etc. 

Так что для того, чтобы сделать это, я думаю, что нужно представление с таких областях, как:

object_name 
attr_1 
attr_2 
etc. 

attr_x Каждый атрибут должен содержать наивысший приоритет версию атрибута из исходной таблицы. Кто-нибудь знает как это сделать? Я знаю только базовый SQL, поэтому я даже не знаю, что это называется, или если это возможно. Кто-нибудь делал это раньше, в любой базе данных SQL-типа? Я бы хотел, если бы не было двух отдельных таблиц. Рад принять любое другое решение, которое выполняет как отслеживаемость, так и требования быстрого запроса.

+0

Пример данных и желаемых результатов будет полезной, объясняя, что вам нужно –

ответ

0

Вот пример запроса, который возвращает все значения с наивысшим приоритетом в том формате, который вы хотите:

SELECT 
    object_name, 
    (SELECT attr_value AS attr_1 
    FROM t 
    WHERE t.object_name=t1.object_name AND attr_name='attr_1' 
    ORDER BY priority DESC LIMIT 1), 
    (SELECT attr_value AS attr_2 
    FROM t 
    WHERE t.object_name=t1.object_name AND attr_name='attr_2' 
    ORDER BY priority DESC LIMIT 1) 
FROM (SELECT DISTINCT object_name FROM t) t1; 

Я предположил, что таблица называется t. Запрос возвращает 2 attr_??? столбцов. Если у вас больше, вам нужно добавить дополнительные подзапросы, по одному для каждого столбца. Если вам это не нравится (например, потому что у вас большое количество attr_name), то мы можем сделать что-то, что не требует, чтобы написать огромный запрос, но он вернет результаты в виде объектов JSON (так что он будет в другом формате).

Если вы хотите, чтобы создать представление, просто выполните следующее:

CREATE VIEW myview AS SELECT ... 
         ^^^ insert the query from above 

Если вам это нужно, чтобы быть как можно быстрее, я рекомендовал бы использовать 2 таблицы: одна для самых приоритетных значений и один для всего остального.

+0

Это потрясающе, спасибо! Я могу сгенерировать запрос в Python на основе списка атрибутов, которые у меня уже есть, поэтому не проблема. Спасибо за подсказку на скорости - я посмотрю, как быстро это с одним, и при необходимости создайте новую таблицу с высоким приоритетом. – vahndi

Смежные вопросы