Функция агрегирования столбцов, которая определяет, равны ли все значения константе в Sybase IQ.

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

Каждая строка представляет значение процесса, который немного похож на тест. Ключ не уникален, а значения также являются текстовыми строками, которые будут только «пройдено» или «не пройдено».

В реальной таблице может быть несколько столбцов «Значение», но для краткости я показал только один.

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

count(all(mytable.value == 'pass'))

Вот пример данных:

| Key | Value | 
| A   | fail  |
| A   | pass  |
| B   | pass  |
| B   | pass  |
| B   | pass  |
| C   | fail  |
| C   | fail  |

Агрегированные данные будут выглядеть так:

| Key | Value |
| A   | fail  |
| B   | pass  |
| C   | fail  |

Так есть ли элегантный способ сделать это?

К вашему сведению, Sybase IQ — не обычная Sybase! ;-)


person Salim Fadhley    schedule 11.11.2013    source источник
comment
Не уверен в конкретных возможностях вашей системы, но если вы можете вычислить MIN(Value) и MAX(Value) и оба они возвращают один и тот же результат, то все отдельные строки также имеют одно и то же значение.   -  person Damien_The_Unbeliever    schedule 11.11.2013


Ответы (2)


Это кажется самым простым решением...

select
  key
  ,sum(case when value = 'pass' then 1 else 0 end) as num_passed
  ,count(*) as num_tests
from mytable
group by key
having num_tests = num_passed
person Hotel    schedule 12.11.2013
comment
Результат: | Key | Value |/n | B | pass |. Куда делись неудачники? Это не правильно. - person Nathan Cooper; 03.07.2018

Я не знаю Sybase-IQ, но со стандартным SQL вы можете сделать это так:

select key, min(value) as value
from mytable
group by key
having sum(case when value = 'pass' then 1 else 0 end) = count(value)
    or sum(case when value = 'fail' then 1 else 0 end) = count(value);

Или, используя предложение Дэмиена:

select key, min(value)
from mytable
group by key
having min(value) = max(value)
person a_horse_with_no_name    schedule 11.11.2013