SQL: как получить записи с уникальным значением столбца и суммировать значения в другом столбце - PullRequest
0 голосов
/ 05 марта 2020

У меня есть эта таблица с именем file

id         integer primary key,
created_on timestamp
updated_on timestamp 
file_name  text not null
path       text not null unique
hash       text not null
size       bigint not null
size_mb    bigint not null

Я хочу получить все записи с уникальным значением hash (это один экземпляр дублирующихся файлов), а затем сумма значения в столбце size до общего количества байт дискового пространства, которые мне понадобятся для резервного копирования одной копии каждого файла.

1 Ответ

1 голос
/ 05 марта 2020

Возвращает только уникальные хэши, т.е. дубликатов не существует:

select *, 
   -- group sum of all files
   sum(size) over () 
from
 (
   select *, 
      -- rows per hash
      count(*) over (partition by hash) as cnt
   from file
 ) as dt
where cnt = 1

Редактировать: Возвращает только одну строку на га sh:

select *, 
   -- group sum of all files
   sum(size) over () 
from
 (
   select *, 
      -- unique number per hash
      row_number(*) over (partition by hash order by hash) as rn
   from file
 ) as dt
where rn = 1

Оба запроса являются стандартными SQL, но PostgreSQL также поддерживает собственный синтаксис:

select *, 
   -- group sum of all files
   sum(size) over () 
from
 (
   select DISTINCT ON (hash) *
   from file
   order by hash
 ) as dt
...