Строки в виде столбцов из одной таблицы, соединенные уникальным значением - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать запрос - результат должен быть получен из двух таблиц:

values таблица:

eventid | elementid |   value
-------------------------------
10      |  1        |   1234
11      |  1        |   1234
11      |  2        |   True

Таким образом, таблица values может иметь несколькозначения для того же elementid.

events таблица:

eventid | eventuid
-------------------
10      |  abcdef
11      |  ghijkg 

Моя цель - создать запрос, отображающий

value1  |   value2  |   eventuid
-----------------------------
True    |  1234     |   abcdef
True    |  5678     |   ghijkg
  • Столбец A: значение для element1
  • Столбец B: значение для element2
  • Столбец C: идентификатор события

, но только если значение для elementid=1 является уникальным , т.е. нет eventid s с таким же значением для того же elementid=1.

Моя попытка была сначала создать представление:

create view unique_event as
select distinct e.eventuid, count(v.value)
from events e
join values v on e.eventid = v.eventid
where v.elementid = 1
group by e.eventuid
having count(v.value) = 1;

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

select v.value as value1, e.eventuid
from events e
join value v on v.eventid = e.eventid
where e.eventuid in (select eventuid from unique_event)
and v.elementid in (1, 2)
group by e.eventuid, v.value;

1 Ответ

0 голосов
/ 06 декабря 2018

Вы уже выполнили более сложную часть, создав список уникальных событий, которые вы хотите включить!

Отсюда легко получить нужную таблицу.

--note that you do not need "distinct" since you are already grouping by the event ids

create view unique_event as
select  max(e.eventuid::text) as eventuid 
 , v.value
 , max(e.eventid) as e.eventid)
from events e
join values v on e.eventid = v.eventid
where v.elementid = 1
group by v.value
having count(e.eventid) = 1;

select e.eventuid
--since we want only one row for the event, we have to tell it which value we want of the value column
--since max ignores null, this will give us the non-null value
-- but if there is only record for the event, min would work just as well
, max(case when v.elementid = 1 then value end) as value1
, max(case when v.elementid = 2 then value end) as value2
from unique_event e
join values v on e.eventid = v.eventid
group by e.eventuid
having max(case when v.elementid = 2 then value end) = 'True'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...