Excel - подсчет уникальных записей [дубликат]

Я не думаю, что вопросник касается только одного вложенного объекта уровня, поэтому я представляю следующую демонстрацию, чтобы продемонстрировать, как получить доступ к узлу глубоко вложенного объекта json. Хорошо, давайте найдем узел с идентификатором '5'.

var data = {
  code: 42,
  items: [{
    id: 1,
    name: 'aaa',
    items: [{
        id: 3,
        name: 'ccc'
      }, {
        id: 4,
        name: 'ddd'
      }]
    }, {
    id: 2,
    name: 'bbb',
    items: [{
        id: 5,
        name: 'eee'
      }, {
        id: 6,
        name: 'fff'
      }]
    }]
};

var jsonloop = new JSONLoop(data, 'id', 'items');

jsonloop.findNodeById(data, 5, function(err, node) {
  if (err) {
    document.write(err);
  } else {
    document.write(JSON.stringify(node, null, 2));
  }
});
<script src="https://rawgit.com/dabeng/JSON-Loop/master/JSONLoop.js"></script>

2
задан Jeeped 19 March 2016 в 20:45
поделиться

2 ответа

Существует довольно распространенный метод псевдо-COUNTUNIQUE¹ на основе функций SUMPRODUCT и COUNTIF , которые выглядят следующим образом.

=SUMPRODUCT(1/COUNTIF(A2:A19, A2:A19&""))

Но это компенсирует условия. Чтобы добавить условия, вам нужно перейти на функцию COUNTIFS . Кроме того, как числитель, так и знаменатель операции деления должны быть скорректированы условиями и инверсией условий, чтобы вы вернули истинный счетчик без ошибок с помощью #DIV/0!.

=SUMPRODUCT(((C$2:C$19>=F2)*(C$2:C$19<=G2)*($B$2:$B$19=E2))/
             (COUNTIFS(A$2:A$19, A$2:A$19&"", C$2:C$19, ">="&F2, C$2:C$19, "<="&G2, $B$2:$B$19, E2)+
              (C$2:C$19<F2)+(C$2:C$19>G2)+($B$2:$B$19<>E2)))

Теперь, когда формула трудно поддерживать, существуют постоянные добавления и удаления к числу строк. Чтобы создать динамические диапазоны, мы можем INDEX каждый полный столбец и использовать MATCH , чтобы найти последнюю дату в качестве терминатора для каждого столбца.

=SUMPRODUCT(((C$2:INDEX(C:C, MATCH(1E+99,C:C ))>=F2)*(C$2:INDEX(C:C, MATCH(1E+99,C:C ))<=G2)*($B$2:INDEX(B:B, MATCH(1E+99,C:C ))=E2))/
    (COUNTIFS(A$2:INDEX(A:A, MATCH(1E+99,C:C )), A$2:INDEX(A:A, MATCH(1E+99,C:C ))&"", C$2:INDEX(C:C, MATCH(1E+99,C:C )), ">="&F2, C$2:INDEX(C:C, MATCH(1E+99,C:C )), "<="&G2, B$2:INDEX(B:B, MATCH(1E+99,C:C )), E2)+
      (C$2:INDEX(C:C, MATCH(1E+99,C:C ))<F2)+(C$2:INDEX(C:C, MATCH(1E+99,C:C ))>G2)+($B$2:INDEX(B:B, MATCH(1E+99,C:C ))<>E2)))

Да, это похоже на беспорядок, но он динамически добавляет и вычитает строки, обработанные функцией SUMPRODUCT, так что эффективность вычислений превзойдена.


¹ Для объяснения того, как это работает, см. Count Unique с SUMPRODUCT () Breakdown .

5
ответ дан Jeeped 24 August 2018 в 19:55
поделиться

Формула работает с несколькими настройками:

  1. Строки даты необходимо преобразовать в значения даты с помощью функции DateValue ()
  2. Операторы сравнения для дат (это должно быть & lt; = 2016 date and> = 2013 date)
  3. Сравнение с «цифровым» должно быть отменено
  4. Внутренний оператор IF нуждается в нуле в качестве значения для ситуации, когда условие терпит неудачу
  5. Я удалил самые крайние скобки, которые не нужны

Ниже приведена модифицированная версия:

= FREQUENCY ( ЕСЛИ (Международный М2: М1000 & л; = ДАТАЗНАЧ ( "6/1/2016"), ЕСЛИ (Международный М2: М1000> = ДАТАЗНАЧ ( "3/23/2013"), ЕСЛИ (Международный I2:! i1000 & л;>» »IF (International I2: i1000 & л;>! "Digital", MATCH (International A2:! A1000, Международный A2: A1000,0), 0)!))), ROW (International A2: A1000) -строка (International ! А2) +1> 0)

0
ответ дан MikeC 24 August 2018 в 19:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: