Чтобы заменить список списка пустых строк пустой строкой, вы можете попробовать выполнить следующий запрос:
q) select from t lj select (b;"")all""~/:b by a from s
Выход:
a b
--------
c ""
d "fill"
Пояснение:
По сути, список пустых строк исходит из команды group
в правой таблице. Поэтому на этапе группировки мы можем сопоставить, если все элементы в сгруппированном списке (b column values
) для определенного значения a
являются пустой строкой. И если они просто заменяют их одной пустой строкой.
q) select (b;"")all""~/:b by a from s
a| b
-| --
b| ""
c| ""
Для a
= c, b
сгруппированными значениями являются (""; ""). Давайте разберем команду:
q) b:("";"")
q) ""~/:b / output 11b
q) all ""~/:b / output 1b
q)(b;"") all ""~/:b / output ""
Последняя команда - индексирование списка. Если результат предыдущей команды равен 1b, что означает, что все элементы являются пустыми строками, тогда возвращается ""
, иначе возвращается фактический b.
Edit:
Исходя из обсуждения в разделе комментариев ответа TerryLynch, похоже, что ваше требование:
- если все значения списка
b
после группировки являются пустыми строками, то возвращается одна пустая строка.
- если значения
b
представляют собой смесь пустых и непустых строк, то удалите все пустые строки.
Для этого вы можете использовать следующий запрос:
q) select from t lj select b:raze ("";b except enlist "") by a from s
Но это привело бы к различным типам для разных значений в столбце b
. Пустая строка будет 10h, а весь список непустых строк будет 0h.
Для согласованного типа можно использовать приведенный ниже запрос, который возвращает enlist""
вместо ""
, но это не будет пустой строкой:
q) select from t lj select b:{(c;enlist "")()~c:x except enlist ""}b by a from s