SQLite: cуммирование с условием


Автор: Artix (user.su)

Задача:

Есть таблица из 3-х полей: идентификатор части объекта, вес этой части, 
и признак повторения стоки данных. Нужно найти суммарный вес объекта (всех строк),
но повторяющиеся строки суммировать только 1 раз.

CREATE TABLE TEST (
    part_id INTEGER,
    weight XPART,
    dup BOOLEAN
);

Данные

1 20 false
2 30 true
3 40 false
4 10 true
4 10 true
2 30 true

Ожидаемый ответ: сумма весов = 100

Решение 1 - очевидное, способом деления таблицы по признаку повторяемости:

SELECT SUM(X) FROM (
  SELECT part_id, MAX(weight) as X FROM TEST WHERE dup=TRUE GROUP BY 1
  UNION ALL
  SELECT part_id, SUM(weight) FROM TEST WHERE dup=FALSE GROUP BY 1
) T


Решение 2 - с помощью оконной функции:

SELECT SUM(X) FROM (
  SELECT IIF(
    ROW_NUMBER() OVER (PARTITION BY part_id ORDER BY part_id, dup) = 1, weight, 0
  ) as X FROM TEST
) T

Решение 3 - с помощью одной группировки:

SELECT SUM(X) FROM (
   SELECT PART_ID,DUP,SUM(PART_VALUE)/IIF(DUP=true,SUM(1),1) as X
   FROM TEST
   GROUP BY PART_ID,DUP
)

или

SELECT SUM(X) FROM (
   SELECT PART_ID,DUP,SUM(PART_VALUE)/IIF(DUP=true,COUNT(*),1) as X
   FROM TEST
   GROUP BY PART_ID,DUP
)

#