Столбец должен появляться в предложении GROUP BY или использоваться в статистической функции (PostgreSQL) - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть база данных банковской информации:

  id    | date     |     asset           
--------+----------+---------------
 1      | 6/30/2001|    333860 
 1      | 3/31/2001|    336896
 1      | 9/30/2001|    349343
 2      | 6/30/2001|    451297
 2      | 3/31/2001|    411421
 2      | 9/30/2001|    430178
 3      | 6/30/2001|    106506
 3      | 3/31/2001|    104196
 3      | 9/30/2001|    106383

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

SELECT DISTINCT(id), SUM(asset) AS mv 
FROM bank2001 
WHERE asset NOT IN (SELECT MAX(asset) FROM bank2001)

Когда я запустил запрос, я получил следующую ошибку:

ОШИБКА: столбец "bank2001.id" должен присутствовать в предложении GROUP BY или быть используется в статистической функции LINE 1: SELECT DISTINCT (id), MAX (asset) AS mx

Я посмотрел эту ошибку, но не могу найти ничего о том, как она связана с этой проблемой, поскольку в моем коде нет GROUP BY. Что означает эта ошибка и как я могу решить эту проблему?

Примечание: код должен был вернуть идентификатор 1.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

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

WHERE asset NOT IN (SELECT MAX(asset) FROM bank2001)

просто удаляет четвертую строку из вашей базы данных. Вы должны рассматривать это как две отдельные задачи - сначала найдите общую сумму, которую имеет каждый банк, а затем найдите вторую по величине из этих сумм. Примерно так (есть другие способы сделать это, но это ближе всего к вашему первоначальному запросу)

--This part gets the asset totals for each bank - returns one row per bank
WITH BankAssets as (
    Select id, SUM(asset) AS assetTotal
    FROM bank2001
    GROUP BY id
)
-- This part returns the top bank that does not have the maximum asset sum
Select id
From BankAssets
WHERE assetTotal NOT IN (SELECT MAX(assetTotal) FROM BankAssets) --skip any banks with the top amount
ORDER BY assetTotal DESC  --order in descending order
LIMIT 1  --only return one row

Обратите внимание, что если бы два верхних банка по сумме активов имели одинаковую сумму, получился бы третий.

0 голосов
/ 06 ноября 2018

Таблица и несколько строк для начала. (Вы должны включить это в свой вопрос.)

create table bank2001 (
  id integer,
  date date,
  asset integer,
  primary key (id, date)
  );

  insert into bank2001 values
 (1, '6/30/2001',    333860), 
 (1, '3/31/2001',    336896),
 (1, '9/30/2001',    349343),
 (2, '6/30/2001',    451297),
 (2, '3/31/2001',    411421),
 (2, '9/30/2001',    430178),
 (3, '6/30/2001',    106506),
 (3, '3/31/2001',    104196),
 (3, '9/30/2001',    106383);

Этот запрос возвращает общее количество активов на один идентификатор.

select id, sum(asset) as total_assets
from bank2001
group by id
order by total_assets desc

id  total_assets
2   1292896
1   1020099
3   317085

Я пытаюсь отобразить идентификатор банка со вторым по величине активом.

Понятно, что правильный ответ - 1. Вы пытаетесь вернуть идентификатор для второй строки. Один из способов - сообщить PostgreSQL, что вы хотите получить обратно одну строку и хотите пропустить первую строку, чтобы получить ее.

with total_assets as (
  select id, sum(asset) as total_assets
  from bank2001
  group by id
)
select id
from total_assets
order by total_assets desc
limit 1 offset 1;
0 голосов
/ 06 ноября 2018

Первый Distinct не Aggregate Функция .. Он удалит дубликаты, но не сделает Aggregate. И у вас есть Sum() функция, которая Aggregate, так что нужно Group By

SELECT 
    DISTINCT(id), SUM(asset) AS mv 
FROM 
    bank2001 
WHERE 
    asset NOT IN (SELECT 
                     MAX(asset) 
                  FROM 
                     bank2001)
GROUP BY
     id

Вот результат: Скрипка

РЕДАКТИРОВАТЬ :

SELECT 
    id, SUM(asset) AS mv 
FROM 
    bank2001 
WHERE 
    asset NOT IN (SELECT 
                     MAX(asset) 
                  FROM 
                     bank2001)
GROUP BY
     id

Как в комментарии .. Group будет отображаться за ID, поэтому Distinct вам это не нужно ..

Вы можете увидеть тот же результат: Скрипка

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