Как проверить соответствие значения в третьем столбце на основании различных комбинаций двух других столбцов? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть таблица с названием здания, например, A, B, C. Эти имена зданий могут повторяться. У меня есть еще одна колонка, которая имеет слово. Например, этаж 1, этаж 2. Опять может быть несколько этажей 1 для каждого здания. Есть третья колонка, в которой есть объекты, такие как телевидение, кирпичи, вентиляторы. Я хочу проверить для каждой комбинации здания с соответствующими этажами, такими как Здание A - этаж 1, Здание A - этаж 2, существует ли объект «кирпич», тогда должна существовать «стена».

ПРИМЕРНЫЕ ДАННЫЕ: Для каждого здания и местоположения, если существует «WALL», должны существовать «WINDOW», «WINDOW1» или «WINDOW2», ELSE FLAG

BUILDING  LOCATION  OBJECT   
A         FLOOR1    WALL
A         FLOOR1    WINDOW  
A         FLOOR2    WALL  
B         FLOOR1    WALL  
C         FLOOR1    WALL  
C         FLOOR1    WINDOW

желаемый выход

BUILDING  LOCATION  ACTION  

A         FLOOR2    FLAG
B         FLOOR1    FLAG

Я пытался использовать GROUP BY, DISTINCT, WHERE EXISTS, но я не могу придумать правильную логику.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Вы можете group by building, location для строк where object in ('WALL', 'WINDOW'):

select building, location, 'FLAG' action
from tablename
where object in ('WALL', 'WINDOW')
group by building, location
having count(distinct object) < 2

Условие count(distinct object) < 2 в предложении having возвращает комбинацию building, location, где 'WALL' и 'WINDOW' не существуют.
См. демо .
Результаты:

| building | location | action |
| -------- | -------- | ------ |
| A        | FLOOR2   | FLAG   |
| B        | FLOOR1   | FLAG   |

Или с НЕ СУЩЕСТВУЮЩИМ:

select t.building, t.location, 'FLAG' action
from tablename t
where object in ('WALL', 'WINDOW')
and not exists (
  select 1 from tablename
  where building = t.building and location = t.location and object <> t.object
)

См. Демоверсию .

0 голосов
/ 14 июня 2019

вложенных таблиц - это то, что вы хотите. Что-то вроде

select column_3
from (
  select *
  from table
  where table.column_3="brick"
) as e
join table t on t.id = e.id
where table.column_3="window"

К вашему сведению: я рекомендую вам использовать это как начало, но для вашего точного случая я могу представить, что это нужно изменить

...