решение1
Поскольку наборы данных сгруппированы по строкам в пары, это используется для идентификации и сравнения значений. Формула проверяет, находится ли первая строка данных на нечетной или четной строке. Двигаясь вперед, это используется для идентификации всех пар.
odd; even,
odd; even,
odd; even,
и т. д.
или
even; odd,
even; odd,
even; odd,
и т. д.
Формула
- Формула использует именованный диапазон,
data
что упрощает ее использование и поддержку.$A2:$C1000
- В вопросе есть базовое предположение, что два члена пары никогда не будут иметь равные значения или что если они это сделают, то они не будут интересны. Если они это сделают, они оба будут отфильтрованы из результатов, так как
x-x=0
.
=LET(
rowOffset, IF(ISEVEN(ROW(INDEX(data,1,1))),0,1),
newValues,
MAP(INDEX(data,,3), LAMBDA(r,IF(r<>"",
IF(ISEVEN(ROW(r)+rowOffset),
IF(r>OFFSET(r,1,0),r-OFFSET(r,1,0),0),
IF(r>OFFSET(r,-1,0),r-OFFSET(r,-1,0),0)),0))),
newData, HSTACK(INDEX(data,,1), INDEX(data,,2), newValues),
FILTER(newData, INDEX(newData,,3)>0))
Примечания
Line | Code
-----+------------------------------------------------
1 | =LET(
2 | rowOffset, IF(ISEVEN(ROW(INDEX(data,1,1))),0,1),
3 | newValues,
4 | MAP(INDEX(data,,3), LAMBDA(r,IF(r<>"",
5 | IF(ISEVEN(ROW(r)+rowOffset),
6 | IF(r>OFFSET(r,1,0),r-OFFSET(r,1,0),0),
7 | IF(r>OFFSET(r,-1,0),r-OFFSET(r,-1,0),0)),0))),
8 | newData, HSTACK(INDEX(data,,1), INDEX(data,,2), newValues),
9 | FILTER(newData, INDEX(newData,,3)>0))
Линия | Примечания |
---|---|
#1 | ИспользоватьПОЗВОЛЯТЬфункция, позволяющая сохранять промежуточные вычисления и определять имена в формуле. |
#2 | rowOffset равно 0 или1 ЛЯМБДАформула (строка 4) предполагает, что члены первой пары находятся в четных строках. rowOffset смещает номер строки по мере необходимостиИНДЕКСиспользуется для идентификации строки 1 столбца 1 data диапазонаINDEX(data,1,1) РЯДполучает номер строки индексированной ячейки ROW(INDEX(data,1,1)) ДАЖЕвозвращает ИСТИНА, если номер строки четный ISEVEN(ROW(INDEX(data,1,1)) и, наконец,ЕСЛИчетное, то 0, или 1 для нечетного IF(ISEVEN(ROW(INDEX(data,1,1))),0,1) |
#3 | Объявить newValues о сохранении результатаЛЯМБДАфункция |
#4 | ЛЯМБДАфункция создает столбец значений0или разница между парой. ИНДЕКС используется для получения старых значений из data столбца 3. INDEX(data,,3) Индексированные столбцыКАРТАвЛЯМБДАФункция MAP(INDEX(data,,3), ЛЯМБДАопределяет r , что хранит значения, отображенные вMAP(INDEX(data,,3), LAMBDA(r, ЕСЛИоператор пропускает остальную частьЛЯМБДАесли отображенное значение пустое IF(r<>"", |
#5 | Проверьте, r является ли он первым или вторым членом пары.РЯДдает нам r номер строки, ROW(r) rowOffset который добавляется в случае, если первые члены находятся в нечетных строкахROW()+rowOffset ДАЖЕвозвращает ИСТИНА, если r строка + rowOffset четнаяISEVEN(ROW()+rowOffset) ЕСЛИ's value if TRUE = 1-й член, & value if false = 2-йIF(ISEVEN(ROW()+rowOffset), |
#6 | 1-й член сравнивает значение со 2-м членомIF(r>OFFSET(r,1,0),r-OFFSET(r,1,0),0) ЕСЛИпроверяет, r больше ли значениеКОМПЕНСИРОВАТЬна 1 строку ниже и 0 столбцов IF(r>OFFSET(r,1,0), "Значение, если истинно" — это вычесть из r значения ниже r-OFFSET(r,1,0) "Значение, если ложно" — это 0 |
#7 | 2-й член сравнивает значение с 1-м членомIF(r>OFFSET(r,-1,0),r-OFFSET(r,-1,0),0) ЕСЛИпроверяет, r больше ли значениеКОМПЕНСИРОВАТЬна 1 строку выше и 0 столбцов IF(r>OFFSET(r,-1,0), "Значение, если истина" - это вычесть из r значения выше e r-OFFSET(r,-1,0) "Значение, если ложь" - это 0 |
#8 | Построить массив newData из столбца ID 1, столбца ID2 иnewValues ИНДЕКСполучает первый столбец ID1 из data диапазонаINDEX(data,,1) ИНДЕКС также получает второй столбец ID2 из data диапазонаINDEX(data,,2) HSTACKобъединяет индексированные столбцы newValues в массив из 3 столбцовnewData HSTACK(INDEX(data,,1), INDEX(data,,2), newValues) |
#9 | ФИЛЬТРмассив newData , где значения 3-го столбца > 0FILTER(newData, INDEX(newData,,3)>0)) |