Ответ 1
Просто выполните GROUP BY
, используйте MAX()
, чтобы вернуть T, если он доступен, иначе F.
select col_1, max(col_2), max(col_3), max(col_4)
from tablename
group by col_1
Как я могу агрегировать некоторые кортежи, подобные этому
COL_1 | COL_2 | COL_3 | COL_4
val | T | F | F
val | F | T | F
с помощью функции OR и вернуть следующую таблицу?
COL_1 | COL_2 | COL_3 | COL_4
val | T | T | F
Просто выполните GROUP BY
, используйте MAX()
, чтобы вернуть T, если он доступен, иначе F.
select col_1, max(col_2), max(col_3), max(col_4)
from tablename
group by col_1
Как примечание (не работает с Oracle): в PostgreSQL вы сделаете следующее:
select col_1, bool_or(col_2), bool_or(col_3), bool_or(col_4)
from tablename group by col_1 order by col_1
Если COL_2
- COL_4
- это текстовые столбцы (char
, varchar
, varchar2
, nvarchar
, nvarchar2
)), содержащие 'T'
или 'F'
, тогда вы можете просто взять MAX
из них, так как 'T' > 'F'
, т.е. 'T'
появляется после 'F'
в лексическом порядке.
SELECT COL_1, MAX(COL_2) AS COL_2, MAX(COL_3) AS COL_3, MAX(COL_4) AS COL_4
FROM table
GROUP BY COL_1
Объяснение: Локальная операция OR возвращает TRUE, если хотя бы один из операндов имеет значение TRUE. MAX() возвращает "T"
, если хотя бы одно значение "T"
и в противном случае "F"
.
Примечание. Если булевы столбцы были объявлены как
COL_x NUMBER(1) DEFAULT 0 NOT NULL
или любого другого числового типа, тогда я бы взял MAX(ABS(col_x))
, так как отрицательное значение также считается TRUE. (Если у вас есть интерфейс доступа с ComboBox, связанный с булевым, он дает значения 0
или -1
.)
SELECT col1 = MAX(CONVERT(tinyint, ISNULL(col1,0))) ...
Объяснение: (S) Сначала он принимает логическое значение в столбце col1, или false, если ноль. Это преобразуется в тип данных TINYINT вместо BIT, который может затем использовать агрегатную функцию MAX(), которая эффективно говорит "если есть истина, возвращать истину" в вашем GROUP BY.