相关疑难解决方法(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万
查看次数

LATERAL和PostgreSQL中的子查询有什么区别?

由于Postgres能够进行LATERAL连接,我一直在阅读它,因为我目前为我的团队执行复杂的数据转储,其中包含大量低效的子查询,这使得整个查询需要四分钟或更长时间.

我知道LATERAL联接可能能够帮助我,但即使在阅读了像Heap Analytics 这样的文章之后,我仍然没有完全遵循.

LATERAL加入的用例是什么?LATERAL连接和子查询之间有什么区别?

sql postgresql subquery lateral-join

119
推荐指数
5
解决办法
7万
查看次数

如何在PostgreSQL中按类别选择最大日期ID?

举个例子,我想按类别选择带有最大日期组的id,结果是:7,2,6

id  category  date
1   a         2013-01-01
2   b         2013-01-03
3   c         2013-01-02
4   a         2013-01-02
5   b         2013-01-02
6   c         2013-01-03
7   a         2013-01-03
8   b         2013-01-01
9   c         2013-01-01
Run Code Online (Sandbox Code Playgroud)

我可以在PostgreSQL中知道如何做到这一点吗?

sql postgresql greatest-n-per-group

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

PostgreSQL MAX和GROUP BY

我有一张桌子id,yearcount.

我想得到MAX(count)每个id并保持year它发生的时间,所以我做这个查询:

SELECT id, year, MAX(count)
FROM table
GROUP BY id;
Run Code Online (Sandbox Code Playgroud)

不幸的是,它给了我一个错误:

错误:列"table.year"必须出现在GROUP BY子句中或用于聚合函数

所以我尝试:

SELECT id, year, MAX(count)
FROM table
GROUP BY id, year;
Run Code Online (Sandbox Code Playgroud)

但是,它没有做MAX(count),它只是显示表格.我想是因为分组的时候yearid,它得到最大的id是特定年份的.

那么,我该如何编写该查询呢?我想要得到idMAX(count),并在今年这种情况发生的时候.

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

37
推荐指数
2
解决办法
5万
查看次数

根据上次日期选择记录

根据Course下面的表格:

在此输入图像描述

如何选择具有最新日期的课程名称的记录?我的意思是如果我有一个ID的两个相同的课程名称,我应该只显示最新的一个作为下面的结果.

简单地说,我只想显示最新的每行("ID","课程名称").

在此输入图像描述

如果我在Course表中有两个日期列,即StartDate和EndDate,我想仅基于EndDate显示相同的内容.

我正在使用PostgreSQL.

sql database postgresql greatest-n-per-group

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

从分组列中重复采样的最佳性能

这个问题是关于first_value()使用其他功能或解决方法的功能.

它也是关于大表中"性能上的微不足道".使用例如.max()在下面解释的上下文中,要求虚假比较.即使速度很快,也会产生一些额外的成本.


这种典型的查询

SELECT x, y, count(*) as n 
FROM t 
GROUP BY x, y;
Run Code Online (Sandbox Code Playgroud)

需要重复所有列GROUP BY以返回多个列.执行此操作的语法糖是使用位置引用:

SELECT x, y, count(*) as n 
FROM t 
GROUP BY x, 2  -- imagine that 2, 3, etc. are repeated with x
Run Code Online (Sandbox Code Playgroud)

有时不仅需要糖,还需要一些语义来理解复杂的上下文:

SELECT x, COALESCE(y,z), count(*) as n 
FROM t 
GROUP BY x, y, z  -- y and z are not "real need" grouping clauses?
Run Code Online (Sandbox Code Playgroud)

我可以想象许多其他复杂的背景.让我们看看通常的解决方案:

SELECT x, max(y) as y, count(*) as n 
FROM t …
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions postgresql-performance

16
推荐指数
2
解决办法
297
查看次数

使用int8范围加入2个大的postgres表不能很好地扩展

我想将IP路由表信息加入到IP whois信息中.我正在使用亚马逊的RDS,这意味着我不能使用Postgres ip4r扩展,因此我使用int8range类型来表示IP地址范围,并使用gist索引.

我的表看起来像这样:

=> \d routing_details
     Table "public.routing_details"
  Column  |   Type    | Modifiers
----------+-----------+-----------
 asn      | text      |
 netblock | text      |
 range    | int8range |
Indexes:
    "idx_routing_details_netblock" btree (netblock)
    "idx_routing_details_range" gist (range)


=> \d netblock_details
    Table "public.netblock_details"
   Column   |   Type    | Modifiers
------------+-----------+-----------
 range      | int8range |
 name       | text      |
 country    | text      |
 source     | text      |
Indexes:
    "idx_netblock_details_range" gist (range)
Run Code Online (Sandbox Code Playgroud)

完整的routing_details表包含不到600K的行,netblock_details包含大约8.25M行.两个表中都有重叠的范围,但是对于routing_details表中的每个范围,我想从netblock_details表中获得单个最佳(最小)匹配.

我提出了2个不同的查询,我认为这些查询将返回准确的数据,一个使用窗口函数,另一个使用DISTINCT ON:

EXPLAIN SELECT DISTINCT ON (r.netblock) *
FROM …
Run Code Online (Sandbox Code Playgroud)

sql postgresql amazon-web-services amazon-rds

12
推荐指数
1
解决办法
557
查看次数

从每组的第一行和最后一行获取值

我是Postgres的新手,来自MySQL,并希望你们中的一个能够帮助我.

我有三列的表:name,week,和value.此表记录了名称,记录高度的周数以及高度值.像这样的东西:

Name  |  Week  | Value
------+--------+-------
John  |  1     | 9
Cassie|  2     | 5
Luke  |  6     | 3
John  |  8     | 14
Cassie|  5     | 7
Luke  |  9     | 5
John  |  2     | 10
Cassie|  4     | 4
Luke  |  7     | 4
Run Code Online (Sandbox Code Playgroud)

我想要的是每个用户的最小周和最大周值的列表.像这样的东西:

Name  |minWeek | Value |maxWeek | value
------+--------+-------+--------+-------
John  |  1     | 9     | 8      | 14
Cassie|  2     | 5     | 5 …
Run Code Online (Sandbox Code Playgroud)

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

10
推荐指数
2
解决办法
1万
查看次数

每周汇总最近加入的记录

updates在Postgres 有一张表是9.4.5像这样:

goal_id    | created_at | status
1          | 2016-01-01 | green
1          | 2016-01-02 | red
2          | 2016-01-02 | amber
Run Code Online (Sandbox Code Playgroud)

和这样的goals表:

id | company_id
1  | 1
2  | 2
Run Code Online (Sandbox Code Playgroud)

我想为每家公司创建一个图表,每周显示所有目标的状态.

示例图表

我想这需要生成一系列过去8周,找到该周之前的每个目标的最新更新,然后计算找到的更新的不同状态.

到目前为止我所拥有的:

SELECT EXTRACT(year from generate_series) AS year, 
       EXTRACT(week from generate_series) AS week,
       u.company_id,
       COUNT(*) FILTER (WHERE u.status = 'green') AS green_count,
       COUNT(*) FILTER (WHERE u.status = 'amber') AS amber_count,
       COUNT(*) FILTER (WHERE u.status = 'red') AS red_count
FROM generate_series(NOW() - INTERVAL '2 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql greatest-n-per-group

10
推荐指数
1
解决办法
387
查看次数

快速获取连接表中最新相关行的顶行

有两个表conversationsmessages,我想获取对话及其最新消息的内容。

conversations- id(主键)、名称、创建时间

messages- id、内容、created_at、conversation_id

目前我们正在运行此查询来获取所需的数据

SELECT
    conversations.id,
    m.content AS last_message_content,
    m.created_at AS last_message_at
FROM
    conversations
INNER JOIN messages m ON conversations.id = m.conversation_id
                     AND m.id = (
    SELECT
        id
    FROM
        messages _m
    WHERE
        m.conversation_id = _m.conversation_id
    ORDER BY
        created_at DESC
    LIMIT 1)
ORDER BY
    last_message_at DESC
LIMIT 15
OFFSET 0
Run Code Online (Sandbox Code Playgroud)

上面的查询返回有效数据,但其性能随着行数的增加而降低。有没有其他方法可以提高性能来编写此查询?例如附加小提琴。

http://sqlfiddle.com/#!17/2decb/2

还尝试了已删除答案之一中的建议:

SELECT DISTINCT ON (c.id)
       c.id,
       m.content AS last_message_content,
       m.created_at AS last_message_at
  FROM conversations AS c
 INNER JOIN messages AS m …
Run Code Online (Sandbox Code Playgroud)

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

10
推荐指数
2
解决办法
373
查看次数