Nano Hash - криптовалюты, майнинг, программирование

Как агрегировать эти данные с помощью Dataweave 2.0?

Возьмите следующий JSON. Это массив объектов.

[
  {
    "objects": [
      {
        "saleItems": [
          {
            "itemID": 1,
            "saleItemType": "Sale",
            "productCode": "072",
            "legacyProductCode": "1071",
            "legacyCategoryCode": "1071",
            "categoryCode": "1071",
            "subCategoryCode": "101",
            "amount": 12,
            "originalAmount": 15,
            "netAmount": 10,
            "originalNetAmount": 12.5,
            "vat": 2.5,
            "unitVAT": 1,
            "vatRate": 20,
            "unitMeasure": "EA",
            "unitPrice": 15,
            "quantity": 1,
            "saleChannel": 0
          }
        ]
      }
    ]
  },
  {
    "objects": [
      {
        "saleItems": [
          {
            "itemID": 1,
            "saleItemType": "Sale",
            "productCode": "072",
            "legacyProductCode": "1071",
            "legacyCategoryCode": "1071",
            "categoryCode": "1071",
            "subCategoryCode": "101",
            "amount": 12,
            "originalAmount": 15,
            "netAmount": 10,
            "originalNetAmount": 12.5,
            "vat": 2.5,
            "unitVAT": 1,
            "vatRate": 20,
            "unitMeasure": "EA",
            "unitPrice": 15,
            "quantity": 1,
            "saleChannel": 0
          }
        ]
      }
    ]
  },
  {
    "objects": [
      {
        "saleItems": [
          {
            "itemID": 1,
            "saleItemType": "Sale",
            "productCode": "072",
            "legacyProductCode": "1071",
            "legacyCategoryCode": "1071",
            "categoryCode": "1071",
            "subCategoryCode": "101",
            "amount": 12,
            "originalAmount": 15,
            "netAmount": 10,
            "originalNetAmount": 12.5,
            "vat": 2.5,
            "unitVAT": 1,
            "vatRate": 20,
            "unitMeasure": "EA",
            "unitPrice": 15,
            "quantity": 1,
            "saleChannel": 0
          }
        ]
      }
    ]
  }
]

Пример вывода этих данных должен быть:

{
  "sales": {
    "saleItems": [
      {
        "saleChannel": "1",
        "categoryCode": "1071",
        "productCode": "072",
        "salesAmountIncludingTax": 11.79,
        "salesAmountExcludingTax": 9.82,
        "discountAmountIncludingTax": 1.0,
        "discountAmountExcludingTax": 0.83,
        "salesQuantity": 10.0
      }
    ],
    "totalSalesAmountIncludingTax": 11.79,
    "totalSalesAmountExcludingTax": 9.82,
    "totalSalesQuantity": 10.0
  },
  "refunds": {
    "refundItems": [
      {
        "saleChannel": "1",
        "categoryCode": "1010",
        "productCode": "033",
        "refundAmountIncludingTax": 11.79,
        "refundAmountExcludingTax": 9.82,
        "discountAmountIncludingTax": 1.0,
        "discountAmountExcludingTax": 0.83,
        "refundQuantity": 10.0
      }
    ],
    "totalRefundAmountIncludingTax": 11.79,
    "totalRefundAmountExcludingTax": 9.82,
    "totalRefundQuantity": 10.0
  }
}

Сложность заключается в агрегировании / суммировании. Например:

В каждом элементе массива полезных данных должно быть агрегирование значений на основе значения. Каждый объект содержит массив объектов saleItems. Если saleChannel = 0 и saleItemType = Sale, и если productCode = X (ранее не встречался), это означает, что должно быть суммирование значений для каждого saleItem, для которого productCode = X.

Пример. Итак, для первых двух объектов может быть productCode 001. Это означает, что эти значения должны быть суммированы. Третьим объектом productCode может быть 002, новый объект должен быть создан в массиве вывода saleItems.

Пример: (то же самое может быть и для возвратов, если операторы if основаны на saleItemType = Refund)

"sales": {
  "saleItems": [
    {
      productCode 001
      salesAmountIncludingTax: **The sum of "amount" field, if saleChannel = 0 && saleItemType = "Sale**
    },
    {
      productCode 002
    }
  ]
}

Суммирование значений должно происходить по следующей логике:

if saleChannel = 0
    group by subCategoryCode
        salesAmountIncludingTax = sum(saleItems.amount where saleItemType="Sale")
        salesAmountExcludingTax = sum(saleItems.netAmount where saleItemType="Sale")
    
if saleChannel != 0
    group by productCode
        salesAmountIncludingTax = sum(saleItems.originalAmount where saleItemType="Sale")
        salesAmountExcludingTax = sum(saleItems.originalNetAmount where saleItemType="Sale")

  • Привет, Джек, тебе не хватает productCode: 033 на входе? 24.07.2020
  • В вашем примере все коды продуктов одинаковы. Что касается того, если у вас есть [pc=1,id =A, pc=1, id=B,pc=2,id=C,pc=1,id=D] Возможен ли этот случай, если да, то как они должны быть сгруппированы? [sum(A,B), sum(C), sum(D)] или [sum(A,B,D), sum(C)] или [sum(A,B), sum(C)] 24.07.2020
  • откуда скидка на выпуск? 24.07.2020
  • pastebin.com/N5sRvBC9 Проверьте ссылку pastebin. Это объясняет логику агрегирования. 24.07.2020

Ответы:


1

Если я правильно понял, нужно сделать что-то вроде этого:

%dw 2.0
output application/json

fun sumItems(itemsToSum, field1, field2) = do {
    var item = itemsToSum[0]
    var discounts = itemsToSum.priceAdjustments
    ---
    {
        "saleChannel": item.saleChannel,
        "categoryCode": item.categoryCode,
        "subCategoryCode": item.subCategoryCode,
        "productCode": item.productCode,
        "salesAmountIncludingTax": sum(itemsToSum[field1]),
        "salesAmountExcludingTax": sum(itemsToSum[field2]),
        "discountAmountIncludingTax": sum(discounts.amount default []),
        "discountAmountExcludingTax": sum(discounts.netAmount default []),
        "salesQuantity": sum(itemsToSum.quantity)
    }
}

var allItems       = flatten(payload..*saleItems default [])
var allSaleItems   = allItems filter ((item) -> item.saleItemType == "Sale")
var channel0       = allSaleItems filter ((item) -> item.saleChannel == 0)
var otherChannels  = allSaleItems filter ((item) -> item.saleChannel != 0)
var summedChannel0 = 
        channel0 
            groupBy ((item) -> item.subCategoryCode)
            pluck ((itemsToSum, groupName) -> do {
                sumItems(itemsToSum, "amount", "netAmount")
            })
var summedOtherChannels = 
        otherChannels 
            groupBy ((item) -> item.productCode)
            pluck ((itemsToSum, groupName) -> do {
                sumItems(itemsToSum, "originalAmount", "originalNetAmount")
            })
var saleItems = summedChannel0 ++ summedOtherChannels
---
{
    sales: {
        "saleItems": saleItems,
        "totalSalesAmountIncludingTax": sum(saleItems.salesAmountIncludingTax),
        "totalSalesAmountExcludingTax": sum(saleItems.salesAmountExcludingTax),
        "totalSalesQuantity": sum(saleItems.salesQuantity)
    }
}
24.07.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..