2013-10-11 2 views
2

У меня есть этот запрос в PostgreSQLsql column по значению поля - возможно ли это?

SELECT numeric_value, entity_id 
FROM data_value 
WHERE 
entity_id = 16029 OR 
entity_id = 16026 OR 
entity_id = 33768 AND 
category_id = 158 

Важно для меня это числовое значение, но я хотел бы, чтобы отобразить в этом формате:

16029 | 16026 | 33768 
value | value | value 
value | value | value 

Возможно ли это каким-то образом? Или это эффективно? Потому что мне приходится работать на очень медленном сервере, и я хочу оптимизировать, насколько это возможно.

ответ

1

Вы пропустили круглые скобки в запросе, она должна быть чем-то вроде этого:

select 
    numeric_value, entity_id 
from data_value 
where 
    entity_id in (16029, 16026, 33768) and 
    category_id = 158 

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

select 
    --<some key>, 
    max(case when entity_id = 16029 then numeric_value end) as 16029, 
    max(case when entity_id = 16026 then numeric_value end) as 16026, 
    max(case when entity_id = 33768 then numeric_value end) as 33768 
from data_value 
where 
    entity_id in (16029, 16026, 33768) and 
    category_id = 158 
--group by <some key> 
+0

К сожалению, этот запрос не делает то, что мне нужно. Даты в базе данных отличаются от разных дат для каждого объекта, и я должен искать эту дату, откуда у меня есть данные для всей сущности. Я написал подзапрос для этого, вы можете найти его под ответом Lajos Veres. Вот что делает мой подзапрос, но ваш запрос возвращает мне все доступные данные. Если бы я мог поместить мой подзапрос в это решение таким образом, как он работает только один раз, когда он может помочь мне. –

+0

@ LeventeKálmán не знает, куда помещать ваш подзапрос, но его можно было бы переписать как 'and date> = (выберите max (датирован) от (выберите min (датирован) как датировано market_data.data_value, где entity_id в (16029, 16026) , 33768,, 16064) group by entity_id) ' –

+0

Я выбираю ваш ответ на лучший, потому что это был самый быстрый и простой метод, и, наконец, это то, что я использовал. Thax для всех, кто помогал мне. –

2

Должно быть возможно создать этот результат с помощью функции crosstab.

Не

самая легкая часть Postgres, так что будьте готовы потратить некоторое время на чтении документации и экспериментировал :)

Как я думаю, что это не сразу видно из дока: tablefunc является расширением, содержащим перекрестным. Расширения не установлены по умолчанию, используйте CREATE EXTENSION для их установки.

+0

Спасибо, как я вижу это может разрешить мне, но у меня нет времени, чтобы сделать это, и сервер настолько медленный, и у меня есть так много данных, чем у меня нет времени для запуска такого большого количества запросов, как требуется для этого на этом пути. Но спасибо вам большое. –

0

Возможно, что-то вроде этого?

select 
     a.value, 
     b.value, 
     c.value 
from 
     (select numeric_value as value from data_value where entity_id=16029 AND category_id =158) a, 
     (select numeric_value as value from data_value where entity_id=16026 AND category_id =158) b, 
     (select numeric_value as value from data_value where entity_id =33768 AND category_id =158) c 
+0

Не разрешение, потому что у меня есть дополнительное условие с подзапросом: 'AND от> = (SELECT MAX (min) FROM (SELECT MIN (датировано) как min FROM market_data.data_value WHERE entity_id = 16029 UNION SELECT MIN (датировано) как min FROM market_data.data_value WHERE entity_id = 16026 UNION SELECT MIN (датировано) как min FROM market_data.data_value WHERE entity_id = 33768 UNION SELECT MIN (датировано) как min FROM market_data.data_value WHERE entity_id = 16034 UNION SELECT MIN (датировано) как min FROM market_data.data_value WHERE entity_id = 16064) AS date) ', и он стал замедляться. Это быстрее, чтобы разобрать его из сценария. –

+0

Но я оставил его, потому что это было неважно. –

+0

Может быть, смеяться с этой функцией WITH: http://www.postgresql.org/docs/8.4/static/queries-with.html? –

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