Сумма Скала на нескольких столбцах в групповом - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь внедрить логику SQL Group By & SUM в функцию Scala.

У меня есть список объектов,

case class TypeToSum(id: Int, active_total: Int, inactive_total: Int)

Я заполняю список, объединяя несколько списков,Наконец, список выглядит так:

{id: 1, active_total: 4, inactive_total: 3},
{id: 1, active_total: 2, inactive_total: 5},
{id: 1, active_total: 1, inactive_total: 1},
{id: 2, active_total: 2, inactive_total: 7},
{id: 2, active_total: 6, inactive_total: 2}

Моя цель - достичь следующего результата:

{id: 1, active_total: 7, inactive_total: 9},
{id: 2, active_total: 8, inactive_total: 9}

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

   lossTotals.groupBy(totals => (totals.product_id, totals.part_id))
      .mapValues(_.map(_.loss_sum).sum).map( .... )

Как я могу реализовать этот (или другой) подход, чтобы получить несколько операций суммирования в разных полях внутритот же список?

1 Ответ

1 голос
/ 18 октября 2019

Вы можете сделать что-то вроде этого:

case class TypeToSum(id: Int, active_total: Int, inactive_total: Int) {
  def merge(other: TypeToSum) = TypeToSum(id, active_total + other.active_total, inactive_total + other.inactive_total)
}

val ls = List(
  TypeToSum(id = 1, active_total = 4, inactive_total = 3),
  TypeToSum(id = 1, active_total = 2, inactive_total = 5),
  TypeToSum(id = 1, active_total = 1, inactive_total = 1),
  TypeToSum(id = 2, active_total = 2, inactive_total = 7),
  TypeToSum(id = 2, active_total = 6, inactive_total = 2))

val sum = ls
  .groupBy(_.id)
  .mapValues {
    case Nil => None
    case List(x) => Some(x)
    case ls => Some(ls.tail.foldLeft(ls.head)(_ merge _))
  }
  .values.flatten

println(sum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...