#sql #qliksense
#sql #qliksense
Вопрос:
Долгое время читал первый постер.
Мне нужна помощь в возврате соответствующего значения при появлении определенного значения.
Например, я хочу вернуть точку A и значение, связанное с этой позицией. В первой строке это будет 1, во второй строке 3 и в третьей строке 1.
----------- -----------
| Column A | Column B |
----------- -----------
| A;B;C;D;E | 1;2;3;4;5 |
| B;A;C;D;E | 2;3;4;5;1 |
| D;C;E;A;B | 5;2;3;1;4 |
----------- -----------
Комментарии:
1. Не могли бы вы лучше объяснить свой вопрос «соответствующее значение при появлении определенного значения» эта часть неясна.
Ответ №1:
Вы можете использовать функцию подполя для разделения обоих значений столбца. Использование SubField
функции (без field_no
параметра) создает строку для каждого значения.
Например: если у нас есть A;B;C;D
значение as в MyField
поле, и мы используем SubField(MyField, ';')
. В результате Qlik создаст 4 строки:
MyField
-------
A
B
C
D
Итак, если мы используем SubField
оба ColumnA
ColumnB
поля и (и сохраняем индекс между новыми строками), мы можем создать новую «плоскую» таблицу, содержащую связь между значениями разделения обоих столбцов
Перезагрузка приведенного ниже скрипта приведет к созданию двух таблиц: Data
и Flatten
. Data
являются «необработанными» данными и Flatten
являются результатом
Взгляните на Value
и Index
столбцы из Flatten
таблицы. Они являются результатом использования SubField
на ColumnA
и ColumnB
// Load the sample data
// preceeding load to add ID to each row
Data:
Load
ColumnA,
ColumnB,
RowNo() as RowId
;
Load * inline [
ColumnA, ColumnB
A;B;C;D;E, 1;2;3;4;5
B;A;C;D;E, 2;3;4;5;1
D;C;E;A;B, 5;2;3;1;4
];
// Passing RowId across just in case if we want to link back
// to the Data table
Flatten_Temp:
// Preceding load to add ID (ValueId) for each value in ColumnA
// this ID will be used to join back to the values in ColumnB
Load
RowId,
ColumnASplit as Value,
RowNo() as ValueId
;
// Using SubField function to create row for each value in ColumnA
Load
RowId,
SubField(ColumnA, ';') as ColumnASplit
Resident
Data
;
JOIN
// Preceding load to add ID (ValueId) for each value in ColumnB
Load
RowId,
ColumnBSplit as Index,
RowNo() as ValueId
;
// Using SubField function to create row for each value in ColumnB
Load
RowId,
SubField(ColumnB, ';') as ColumnBSplit
Resident
Data
;
NoConcatenate
// Load only 'A' values from the table above
Flatten:
Load
*
Resident
Flatten_Temp
Where
Value = 'A'
;
Drop Table Flatten_Temp;
Обновление: Скрипт обновлен, чтобы возвращать только значения для A
Комментарии:
1. привет, Стефан, это не совсем то, на что я надеюсь. Мне нужно только значение, соответствующее A для каждого возвращаемого, а не все остальные значения (B, C, D и т.д.).
2. Обновлен скрипт для загрузки резидента из итоговой таблицы и фильтрации результата только для
A