这是我的代码:
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(*)最大的行.
我该怎么做呢?
出于分页目的,我需要使用LIMIT和OFFSET子句运行查询.但是我还需要计算没有LIMIT和OFFSET子句的查询返回的行数.
我想跑:
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优化它的方式,这样它比单独运行更快?
这个问题是关于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) 在这种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)
为什么我不能在子句cost的SELECT …
我有桌子
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甚至更新版本都有一些功能?我搜索过但没找到任何东西.
我使用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) 我的查询如下
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
我在这里有一个问题,我希望有一个简单的解决方案.我会尝试尽可能简单:
select * from tickets JOIN attendees ON attendee.id = tickets.attendee_id
Run Code Online (Sandbox Code Playgroud)
也就是说,我需要运行一个查询,返回有关票证的各种信息,包括总收入.问题是,如果2张门票属于同一位与会者,则会将其收入计入两次.如何仅将与会者收入相加一次?
我不想使用子查询,因为我的ORM使这很困难.如果我想为多列执行此操作,则子查询解决方案无法扩展.
这就是我所拥有的:
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
我有一张桌子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
首先,是的,我已经阅读了DO声明的文档:) http://www.postgresql.org/docs/9.1/static/sql-do.html
所以我的问题:
我需要执行一些包含UPDATE语句的动态代码块,并计算所有受影响行的数量.我正在使用Ado.Net提供商.
在Oracle中,解决方案将包含4个步骤:
我怎么能用PostgreSQL做到这一点?我正在使用npgsql提供程序,但如果有帮助可以迁移到devard.
我正在尝试创建"总计百分比"列,并且当前使用的子查询没有任何问题:
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子句是什么,并将其注入查询.这个逻辑没有考虑到如上所述的子查询的存在,所以在返回并重建所有现有逻辑以解决这个问题之前,我想我会先看看是否有另一个解决方案.
我试过用窗口函数来完成这个效果,但无济于事.
我使用 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
我有一个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
postgresql ×12
sql ×11
pagination ×3
jsonb ×2
aggregate ×1
alias ×1
array-agg ×1
count ×1
duplicates ×1
dynamic-sql ×1
limit ×1
percentage ×1
plpgsql ×1
sql-limit ×1
sql-order-by ×1