Страницы: 1
RSS
Power Query отсечение лишних строк
 
Добры день, всем!
Помогите с решением нетривиальной задачки с помощью PowerQuery отсечь ненужные строки в этой таблице:
ДатаПараметр1Параметр2Параметр3Параметр4
21.03.2023СинийШирокийCall2158
19.09.2023СинийШирокийCall8496
19.03.2024СинийШирокийCall1487
17.09.2024СинийШирокийCall3214
18.03.2025СинийШирокийCall9841
16.09.2025СинийШирокийCall3217
17.03.2026СинийШирокийне Call1898
17.03.2026СинийШирокийCall1478
15.09.2026СинийШирокийCall1456
16.03.2027СинийШирокийCall3259
14.09.2027СинийШирокийCall9165
14.03.2028СинийШирокийCall28
12.09.2028СинийШирокийCall5059
13.03.2029СинийШирокийCall7645
11.09.2029СинийШирокийCall6328
12.03.2030СинийШирокийCall7976
10.09.2030СинийШирокийCall6045
11.03.2031СинийШирокийCall3765
11.03.2031СинийШирокийне Call4007
30.09.2022ЖелтыйШирокийне Call2158
30.09.2022ЖелтыйШирокийCall8496
30.12.2022ЖелтыйШирокийCall1487
31.03.2023ЖелтыйШирокийCall3214
30.06.2023ЖелтыйШирокийCall9841
29.09.2023ЖелтыйШирокийCall3217
29.12.2023ЖелтыйШирокийне Call1898
29.03.2024ЖелтыйШирокийCall1478
28.06.2024ЖелтыйШирокийCall1456
27.09.2024ЖелтыйШирокийCall3259
27.09.2024ЖелтыйШирокийCall9165
Правило отсечения: Как только  в столбце "Параметр3" появляется значение "не Call", то убираем все значения с теми же "Параметр1" и "Параметр2" дата которых больше, чем дата когда появилось значение "не Call".

В результате получится следующая таблица:
ДатаПараметр1Параметр2Параметр3Параметр4
21.03.2023СинийШирокийCall2158
19.09.2023СинийШирокийCall8496
19.03.2024СинийШирокийCall1487
17.09.2024СинийШирокийCall3214
18.03.2025СинийШирокийCall9841
16.09.2025СинийШирокийCall3217
17.03.2026СинийШирокийне Call1898
17.03.2026СинийШирокийCall1478
30.09.2022ЖелтыйШирокийне Call2158
30.09.2022ЖелтыйШирокийCall8496
Прикладываю пример в Excel. Буду очень рад помощи, спасибо!!!
Изменено: deffocus - 23.09.2022 16:16:43
 
Не List.Generate)
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Added Index" = Table.AddIndexColumn(Источник, "Индекс"),
    #"Grouped Rows" = Table.Group(#"Added Index", {"Параметр1", "Параметр2"}, {"a", each 
    let a=_ , b = Table.SelectRows(a, each [Параметр3] = "не Call"){0} in Table.SelectRows(a, each
    [Индекс] < b[Индекс] or [Дата] <= b[Дата])}),
    Custom1 = Table.Combine( #"Grouped Rows"[a])
in
    Custom1

deffocus, покажите в примере при каких данных этот запрос не сработает
Изменено: Михаил Л - 23.09.2022 18:58:51
 
Михаил Л, без сортировки в запросе - легко :) Во вложении изменил одну цифру в одной дате :)
И еще вариантик:
Код
let
  src = Excel.CurrentWorkbook(){[ Name = "Таблица1" ]}[Content],
  typed = Table.TransformColumnTypes ( src, { { "Дата", type date }, { "Параметр4", Int64.Type } } ),
  group = Table.Group (
    typed,
    { "Параметр1", "Параметр2" },
    {
      {
        "tbl",
        ( t ) =>
          [
            firstNCdate = List.Min ( Table.SelectRows ( t, ( r ) => r[Параметр3] = "не Call" )[Дата] ),
            filter      = Table.SelectRows ( t, ( r ) => r[Дата] <= firstNCdate )
          ][filter],
        type table
      }
    }
  ),
  combine = Table.Combine ( group[tbl] )
in
  combine
Изменено: surkenny - 23.09.2022 23:56:30
 
surkenny, запрос не всегда выдаст нужный результат - это я знаю
К тому же неизвестно будет ли ниже еще и вторая партия(Синий и Широкий) или (Желтый и Широкий).
Потому и прошу добавить данные при которых запрос не даст ожидаемое
 
Михаил Л, surkenny, большое спасибо за помощь!
Проверил оба варианта.
При какой комбинации они не работают: если вообще не найдено значения "не Call", в таком случае все данные должны попасть :)

Прикрепляю пример с этими данными.
 
deffocus, а Вы с PQ совсем не работаете? :) Чуть измените: добавьте условие firstNCdate = null:
Код
let
  src = Excel.CurrentWorkbook(){[ Name = "Таблица1" ]}[Content],
  typed = Table.TransformColumnTypes ( src, { { "Дата", type date }, { "Параметр4", Int64.Type } } ),
  group = Table.Group (
    typed,
    { "Параметр1", "Параметр2" },
    {
      {
        "tbl",
        ( t ) =>
          [
            firstNCdate = List.Min ( Table.SelectRows ( t, ( r ) => r[Параметр3] = "не Call" )[Дата] ),
            filter      = if firstNCdate = null then t else Table.SelectRows ( t, ( r ) => r[Дата] <= firstNCdate )
          ][filter],
        type table
      }
    }
  ),
  combine = Table.Combine ( group[tbl] )
in
  combine
Изменено: surkenny - 26.09.2022 14:47:19
 
surkenny, работаю, но не на таком уровне как Вы. Большое спасибо, очень помогли - все работает!
Страницы: 1
Наверх