Выбор других столбцов не в счет, сгруппировать по - PullRequest
0 голосов
/ 05 сентября 2018

Итак, у меня есть следующая таблица

product_id      sender_id      timestamp      ...other columns...
1               2              1222
1               2              3423
1               2              1231
2               2              890
3               4              234
2               3              234234

Я хочу получить строки, где sender_id = 2, но я хочу посчитать и сгруппировать по product_id и отсортировать по убыванию отметки времени. Это означает, что мне нужен следующий результат

product_id      sender_id      timestamp      count      ...other columns...
1               2              3423           3
2               2              890            1

Я попробовал следующий запрос:

SELECT product_id, sender_id, timestamp, count(product_id), ...other columns...
FROM table
WHERE sender_id = 2
GROUP BY product_id

Но я получаю следующую ошибку Error in query: ERROR: column "table.sender_id" must appear in the GROUP BY clause or be used in an aggregate function

Похоже, я не могу выбрать столбцы, которых нет в GROUP BY. Другой метод, который я нашел в Интернете, состоял в том, чтобы присоединиться к

SELECT product_id, sender_id, timestamp, count, ...other columns...
FROM table
JOIN (
    SELECT product_id, COUNT(product_id) AS count
    FROM table
    GROUP BY (product_id)
) table1 ON table.product_id = table1.product_id
WHERE sender_id = 2
GROUP BY product_id

Но при этом просто перечисляются все строки без группировки или подсчета. Я предполагаю, что часть ON просто расширяет таблицу снова.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Просто проведите тренировку со своими данными:

CREATE TABLE products (product_id INTEGER,
sender_id INTEGER,
time_stamp INTEGER)

INSERT INTO products VALUES
(1,2,1222),
(1,2,3423),
(1,2,1231),
(2,2,890),
(3,4,234),
(2,3,234234)

SELECT  product_id,sender_id,string_agg(time_stamp::text,','),count(product_id) 
FROM products
WHERE sender_id=2
GROUP BY product_id,sender_id

Здесь у вас есть отдельная временная метка, поэтому вам нужно применить какой-либо агрегат или просто удалить этот столбец в операторе select.

Если вы удалите time_stamp в операторе select, это будет очень просто, как показано ниже:

SELECT  product_id,sender_id,count(product_id) 
FROM products
WHERE sender_id=2
GROUP BY product_id,sender_id
0 голосов
/ 05 сентября 2018

Попробуйте сгруппировать, используя product_id, sender_id

select product_id, sender_id, count(product_id), max(timestamp) maxtm 
from t
where sender_id = 2
group by product_id, sender_id
order by maxtm desc

Если вам нужны и другие столбцы:

select t.*, t1.product_count
from t
inner join (
    select product_id, sender_id, count(product_id) product_count, max(timestamp) maxtm 
    from t
    where sender_id = 2
    group by product_id, sender_id
) t1
on t.product_id = t1.product_id and t.sender_id = t1.sender_id and t.timestamp = t1.maxtm
order by t1.maxtm desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...