相关疑难解决方法(0)

我可以在SQL中执行max(count(*))吗?

这是我的代码:

    select yr,count(*)  from movie
join casting on casting.movieid=movie.id
join actor on casting.actorid = actor.id
where actor.name = 'John Travolta'
group by yr
Run Code Online (Sandbox Code Playgroud)

这是问题所在

这是"约翰特拉沃尔塔"最繁忙的几年.显示他每年制作的电影数量.

这是表结构:

movie(id, title, yr, score, votes, director)
actor(id, name)
casting(movieid, actorid, ord)
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

yr  count(*)
1976    1
1977    1
1978    1
1981    1
1994    1
etcetc
Run Code Online (Sandbox Code Playgroud)

我需要得到count(*)最大的行.

我该怎么做呢?

sql

66
推荐指数
4
解决办法
25万
查看次数

使用LIMIT/OFFSET运行查询,并获取总行数

出于分页目的,我需要使用LIMITOFFSET子句运行查询.但是我还需要计算没有LIMITOFFSET子句的查询返回的行数.

我想跑:

SELECT * FROM table WHERE /* whatever */ ORDER BY col1 LIMIT ? OFFSET ?
Run Code Online (Sandbox Code Playgroud)

和:

SELECT COUNT(*) FROM table WHERE /* whatever */
Run Code Online (Sandbox Code Playgroud)

同时.有没有办法做到这一点,特别是让Postgres优化它的方式,这样它比单独运行更快?

sql postgresql pagination count limit

56
推荐指数
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
查看次数

PostgreSQL不接受WHERE子句中的列别名

在这种pgexercises有关加入3页不同的表,给出的答案是如下:

select mems.firstname || ' ' || mems.surname as member, 
    facs.name as facility, 
    case 
        when mems.memid = 0 then
            bks.slots*facs.guestcost
        else
            bks.slots*facs.membercost
    end as cost
        from
                cd.members mems                
                inner join cd.bookings bks
                        on mems.memid = bks.memid
                inner join cd.facilities facs
                        on bks.facid = facs.facid
        where
        bks.starttime >= '2012-09-14' and 
        bks.starttime < '2012-09-15' and (
            (mems.memid = 0 and bks.slots*facs.guestcost > 30) or
            (mems.memid != 0 and bks.slots*facs.membercost > 30)
        )
order by cost desc;
Run Code Online (Sandbox Code Playgroud)

为什么我不能在子句costSELECT …

sql postgresql alias operator-precedence

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

在大表上使用OFFSET优化查询

我有桌子

create table big_table (
id serial primary key,
-- other columns here
vote int
); 
Run Code Online (Sandbox Code Playgroud)

这个表非常大,大约有7000万行,我需要查询:

SELECT * FROM big_table
ORDER BY vote [ASC|DESC], id [ASC|DESC]
OFFSET x LIMIT n  -- I need this for pagination
Run Code Online (Sandbox Code Playgroud)

您可能知道,当x数字很​​大时,这样的查询非常慢.

为了性能优化,我添加了索引:

create index vote_order_asc on big_table (vote asc, id asc);
Run Code Online (Sandbox Code Playgroud)

create index vote_order_desc on big_table (vote desc, id desc);
Run Code Online (Sandbox Code Playgroud)

EXPLAIN显示上面的SELECT查询使用这些索引,但无论如何都有很大的偏移量.

如何OFFSET在大表中优化查询?也许PostgreSQL 9.5甚至更新版本都有一些功能?我搜索过但没找到任何东西.

sql postgresql pagination sql-order-by postgresql-9.5

9
推荐指数
1
解决办法
9042
查看次数

查询包含JSON对象数组的jsonb列

我使用PostgreSQL 9.5和Rails 5.我想查询jsonb下面显示的包含JSON对象数组的列,以返回包含的所有JSON数组元素{"kind":"person"}并执行计数.我使用
SQL显示在json数据下面.运行查询只返回一个空数组.

我已经尝试了这里这里建议的查询.

这就是我的jsonb数据:

   '[
        {"kind":"person", "filter_term":"56","selected_attr":"customer"},
        {"kind":"email", "filter_term":"marketer","selected_attr":"job_title"}
      ]'
Run Code Online (Sandbox Code Playgroud)

我想要一个sql查询返回:

                             data
----------------------------------------------------------------------
 '{"kind":"person", "filter_term":"56","selected_attr":"customer"}'
(1 row)
Run Code Online (Sandbox Code Playgroud)

和另一个返回数组的查询,以便我可以在我的应用程序中调用count并在其上循环以创建表单:

 data
----------------------------------------------------------------------
 '[{"kind":"person", "filter_term":"56","selected_attr":"customer"}]'
 (1 row)
Run Code Online (Sandbox Code Playgroud)

我试过这个SQL查询:

 "SELECT * FROM \"segments\" WHERE (payload @> '[{\"kind\":\"person\"}]')"
Run Code Online (Sandbox Code Playgroud)

我也试过这个查询:

  "SELECT payload FROM segments WHERE payload @> '[{\"kind\":\"person\"}]'::jsonb;"
Run Code Online (Sandbox Code Playgroud)

这是第三个查询:

 "SELECT * FROM segments s WHERE s.payload->'\"#{a}\"' @> '[{\"kind\":\"person\"}]';"
Run Code Online (Sandbox Code Playgroud)

该模型:

class Segment < ApplicationRecord
 store_accessor :payload,:kind, :filter_term, :selected_model_name, :selected_attr, :limit, :selected_operator …
Run Code Online (Sandbox Code Playgroud)

sql postgresql ruby-on-rails rails-activerecord jsonb

7
推荐指数
1
解决办法
4965
查看次数

Postgres 查询结果到 json 对象

我的查询如下

SELECT w.payload,
       Count('payload') OVER () AS ROWCOUNT
FROM wholesale_confirmation.wholesale_order_confirmation w
WHERE w.delivery_date = COALESCE(NULL, w.delivery_date)
  AND w.ship_to_location_id = COALESCE(NULL, w.ship_to_location_id)
  AND w.order_raised_date = COALESCE(NULL, w.order_raised_date)
  AND w.ship_from_location_id = COALESCE(NULL, w.ship_from_location_id)
LIMIT 10
OFFSET 0;
Run Code Online (Sandbox Code Playgroud)

这给了我这样的结果:

结果

我想要{"payload:"[payload1,payload2,payload3],"rowcount":n}


Postgres 10.3版,payload数据类型为jsonb

postgresql pagination aggregate-functions sql-limit jsonb

6
推荐指数
1
解决办法
8711
查看次数

获取连接表列的不同总和

我在这里有一个问题,我希望有一个简单的解决方案.我会尝试尽可能简单:

  • 票证属于与会者
  • 例:

select * from tickets JOIN attendees ON attendee.id = tickets.attendee_id
Run Code Online (Sandbox Code Playgroud)
  • 与会者有一个名为"收入"的十进制列

也就是说,我需要运行一个查询,返回有关票证的各种信息,包括总收入.问题是,如果2张门票属于同一位与会者,则会将其收入计入两次.如何仅将与会者收入相加一次?

我不想使用子查询,因为我的ORM使这很困难.如果我想为多列执行此操作,则子查询解决方案无法扩展.

这就是我所拥有的:

  • 1位收入为100的与会者
  • 两张属于该与会者的门票

Select count(tickets.*) as tickets_count
     , sum(attendees.revenue) as atendees_revenue
from tickets LEFT OUTER JOIN attendees ON attendees.id = tickets.attendee_id;
Run Code Online (Sandbox Code Playgroud)

=>这告诉我这attendees_revenue是200.我希望它是100.因为数据库中有一个参与者,其现有的回报为100.我不希望参与者被重复计算.

如果可能,请告诉我.

sql postgresql aggregate-functions duplicate-removal window-functions

5
推荐指数
1
解决办法
6329
查看次数

在列中查找具有重复值的行

我有一张桌子author_data:

 author_id | author_name
 ----------+----------------
 9         | ernest jordan
 14        | k moribe
 15        | ernest jordan
 25        | william h nailon 
 79        | howard jason
 36        | k moribe
Run Code Online (Sandbox Code Playgroud)

现在我需要结果如下:

 author_id | author_name                                                  
 ----------+----------------
 9         | ernest jordan
 15        | ernest jordan     
 14        | k moribe 
 36        | k moribe
Run Code Online (Sandbox Code Playgroud)

也就是说,我需要author_id具有重复外观的名称.我试过这句话:

select author_id,count(author_name)
from author_data
group by author_name
having count(author_name)>1
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我怎么能得到这个?

sql postgresql aggregate-functions duplicates window-functions

5
推荐指数
1
解决办法
6721
查看次数

计算PostgreSQL中受批处理查询影响的行数

首先,是的,我已经阅读了DO声明的文档:) http://www.postgresql.org/docs/9.1/static/sql-do.html

所以我的问题:

我需要执行一些包含UPDATE语句的动态代码块,并计算所有受影响行的数量.我正在使用Ado.Net提供商.

在Oracle中,解决方案将包含4个步骤:

  1. 将InputOutput参数"N"添加到命令
  2. 添加BEGIN ... END; 命令
  3. add :N:=:每个语句后N + sql%rowcount.
  4. 完成!执行后我们可以从命令中读取N参数.

我怎么能用PostgreSQL做到这一点?我正在使用npgsql提供程序,但如果有帮助可以迁移到devard.

postgresql dynamic-sql plpgsql

4
推荐指数
1
解决办法
5693
查看次数

Postgres中没有子查询的总计算百分比

我正在尝试创建"总计百分比"列,并且当前使用的子查询没有任何问题:

SELECT ID, COUNT(*), COUNT(*) / (SELECT COUNT(*)
FROM DATA) AS % OF TOTAL FROM DATA GROUP BY ID;

|  ID  | COUNT | % OF TOTAL |
|  1   |  100  |    0.10    |
|  2   |  800  |    0.80    |
|  3   |  100  |    0.10    |
Run Code Online (Sandbox Code Playgroud)

但是,出于这个问题范围之外的原因,我想看看是否有任何方法可以在不使用子查询的情况下实现此目的.本质上,应用程序使用SQL查询之外的逻辑来确定WHERE子句是什么,并将其注入查询.这个逻辑没有考虑到如上所述的子查询的存在,所以在返回并重建所有现有逻辑以解决这个问题之前,我想我会先看看是否有另一个解决方案.

我试过用窗口函数来完成这个效果,但无济于事.

sql postgresql aggregate-functions percentage

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

使用 ARRAY_AGG 获取列中的第一个非 NULL 值是否浪费?

我使用 PostgreSQL 14 来管理一个存储医生表更新的表:用户可以更新医生的名字、姓氏和/或年龄。更新操作未触及的字段具有值NULL

这是涉及两名不同医务人员的四次编辑的示例。ID 为 3 的医生收到了三个更新:前两个正在更新字段age,第三个涉及first_name

SELECT * FROM medic_edits;
Run Code Online (Sandbox Code Playgroud)
ID 医生ID 年龄
1 1 印地
2 3 59
3 3 63
4 3 鲍勃

我想合并此表,以便在结果表中每个医生有一行,提供累积编辑。这是我当前的查询及其产生的输出:

SELECT
  medic_id,
  (ARRAY_REMOVE(ARRAY_AGG(first_name ORDER BY id DESC), NULL))[1] AS first_name,
  (ARRAY_REMOVE(ARRAY_AGG(last_name ORDER BY id DESC), NULL))[1] AS last_name,
  (ARRAY_REMOVE(ARRAY_AGG(age ORDER BY id DESC), NULL))[1] AS last_name
FROM medic_edits
GROUP BY medic_id
;
Run Code Online (Sandbox Code Playgroud)
医生ID
1 印地
3 鲍勃 63

这正是我所期望的输出,但我怀疑这个ARRAY_REMOVE/ARRAY_AGG逻辑有点浪费。我想知道是否有一种方法可以在这里使用分区来获得良好的利润,该 …

sql postgresql greatest-n-per-group postgresql-performance array-agg

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

运行Postgres查询按一个字段分组并按另一个字段排序

我有一个PostgreSQL表,其中包含以下相关字段:

url
title
created_at
Run Code Online (Sandbox Code Playgroud)

可以有许多行包含相同的URL但标题不同.以下是一些示例行:

www.nytimes.com | The New York Times         | 2016-01-01 00:00:00`
www.wsj.com     | The Wall Street Journal    | 2016-01-03 15:32:13`
www.nytimes.com | The New York Times Online  | 2016-01-06 07:19:08`
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取列出以下字段的输出:

1)url
2)title对应于该唯一created_at
的全部计数的最高值3)titleurl

因此,上面示例的输出行看起来像这样:

www.nytimes.com | The New York Times Online | 2
www.wsj.com     | The Wall Street Journal   | 1
Run Code Online (Sandbox Code Playgroud)

基于我在类似问题上阅读的众多SO帖子,看起来我获得前两个字段(url和最新title)的最佳选择是使用DISTINCT ON:

select distinct on (url) url, title from headlines order by url, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate greatest-n-per-group window-functions

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