Страницы: 1
RSS
PQ/DAX как найти предпоследнее по величине
 
Уважаемые форумчане, добрый день!
Подскажите, пожалуйста аналог функции НАИБОЛЬШИЙ LARGE() в PowerQuery и/или DAX (если и там и там подскажете, будет вообще круто).
Мне нужно найти в списке дат максимальную, минимальную и предпоследнюю максимальную, с мин/макс справилась, а вот с наибольшей не выходит(
 
Настя_Nastya,
PQ (try ... otherwise ... на случай, если у Наименования будет только одна уникальная дата):
Код
let
  src = Excel.CurrentWorkbook(){[ Name = "Таблица1" ]}[Content],
  typed = Table.TransformColumnTypes ( src, { { "Дата", type date } } ),
  group = Table.Group (
    typed,
    { "Наименование" },
    {
      { "первая дата", each List.Min ( [Дата] ), type date },
      { "последняя дата", each List.Max ( [Дата] ), type date },
      { "предпоследняя дата", each try List.Sort ( List.Distinct ( [Дата] ), Order.Descending ){1} otherwise [Дата]{0}, type date }
    }
  ),
  unpivot = Table.UnpivotOtherColumns ( group, { "Наименование" }, "тип даты", "Дата" )
in
  unpivot

DAX (вычисляемый столбец):
Код
Тип даты = 
=
VAR mn =
    CALCULATE ( MIN ( 'Таблица1'[Дата] ); ALL ( 'Таблица1'[Дата] ) )
VAR mx =
    CALCULATE ( MAX ( 'Таблица1'[Дата] ); ALL ( 'Таблица1'[Дата] ) )
VAR pn =
    CALCULATE (
        MAX ( 'Таблица1'[Дата] );
        ALL ( 'Таблица1'[Дата] );
        'Таблица1'[Дата] < mx
    )
VAR result =
    SWITCH (
        'Таблица1'[Дата];
        mn; "первая дата";
        mx; "последняя дата";
        pn; "предпоследняя дата"
    )
RETURN
    result
Изменено: surkenny - 25.03.2022 16:48:59
 
Можно еще без Unpivot в PQ (возможно, будет быстрее, но нужно тестить):
Код
let
  src = Excel.CurrentWorkbook(){[ Name = "Таблица1" ]}[Content],
  typed = Table.TransformColumnTypes ( src, { { "Дата", type date } } ),
  group = Table.Group (
    typed,
    { "Наименование" },
    {
      {
        "tbl",
        ( t ) =>
          Table.FromRows (
            {
              { t[Наименование]{0}, List.Min ( t[Дата] ), "первая дата" },
              { t[Наименование]{0}, try List.Sort ( List.Distinct ( t[Дата] ), Order.Descending ){1} otherwise t[Дата]{0}, "предпоследняя дата" },
              { t[Наименование]{0}, List.Max ( t[Дата] ), "последняя дата" }
            },
            type table [ Наименование = text, Дата = date, Тип даты = text ]
          )
      }
    }
  ),
  combine = Table.Combine ( group[tbl] )
in
  combine
 
surkenny, в очередной раз спасибо огромное!
 
surkenny, Джедай, скажи пожалуйста, как именно происходит вычисление столбца с предпоследней датой в PQ? Остальные шаги я понял - группируем по дате, указываем мин и макс дату, потом в "преобразовании" отменяем свёртывание. Но как быть с предпоследней датой, как она создаётся? Всё пишется от руки? Заранее спасибо!
 
pikni4ok, да, более сложные выражения уже придется писать самостоятельно, а не выбирать кнопками :)
 
surkenny, подскажи, пожалуйста, где можно поучиться продвинутому кодингу в PQ и DAX?
 
Цитата
pikni4ok написал:
где можно поучиться продвинутому кодингу в PQ
Вот намечается)
 
delete
Изменено: Dyroff - 08.08.2023 01:06:15
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
Страницы: 1
Наверх