相关疑难解决方法(0)

选择每个GROUP BY组中的第一行?

正如标题所示,我想选择用a组成的每组行的第一行GROUP BY.

具体来说,如果我有一个purchases看起来像这样的表:

SELECT * FROM purchases;
Run Code Online (Sandbox Code Playgroud)

我的输出:

id | customer | total
---+----------+------
 1 | Joe      | 5
 2 | Sally    | 3
 3 | Joe      | 2
 4 | Sally    | 1

我想查询每个产品id的最大购买量(total)customer.像这样的东西:

SELECT FIRST(id), customer, FIRST(total)
FROM  purchases
GROUP BY customer
ORDER BY total DESC;
Run Code Online (Sandbox Code Playgroud)

预期产出:

FIRST(id) | customer | FIRST(total)
----------+----------+-------------
        1 | Joe      | 5
        2 | Sally    | 3

sql sqlite postgresql group-by greatest-n-per-group

1205
推荐指数
16
解决办法
95万
查看次数

PostgreSQL按日期时间asc排序,先是null吗?

我需要按日期/时间字段对PostgreSQL表进行排序,例如last_updated.

但是,该字段允许为空或空,我想与空记录last_updated之前,非空last_updated.
这可能吗?

order by last_updated asc /* and null last_updated records first ?? */
Run Code Online (Sandbox Code Playgroud)

sql postgresql null sql-order-by

69
推荐指数
2
解决办法
4万
查看次数

优化GROUP BY查询以检索每个用户的最新记录

我在Postgres 9.2中有下表(简化形式)

CREATE TABLE log (
    log_date DATE,
    user_id  INTEGER,
    payload  INTEGER
);
Run Code Online (Sandbox Code Playgroud)

它每个用户和每天最多包含一条记录.每天将有大约500,000条记录,为期300天.每个用户的running_total总是在增加.

我想在特定日期之前有效地检索每个用户的最新记录.我的查询是:

SELECT user_id, max(log_date), max(payload) 
FROM log 
WHERE log_date <= :mydate 
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)

这非常慢.我也尝试过:

SELECT DISTINCT ON(user_id), log_date, payload
FROM log
WHERE log_date <= :mydate
ORDER BY user_id, log_date DESC;
Run Code Online (Sandbox Code Playgroud)

具有相同的计划,同样缓慢.

到目前为止,我在user_msg_log(aggr_date)上有一个索引,但没有多大帮助.我应该用什么其他索引来加快速度,还是以任何其他方式实现我的目标?

sql postgresql indexing greatest-n-per-group postgresql-performance

45
推荐指数
3
解决办法
3万
查看次数