有人可以帮我理解当我将WHERE子句添加到具有COUNT(*)LEFT JOIN的查询时发生的以下行为吗?
我有两张桌子:
TABLE 1: customers
customer_id | name
------------------
1 | Bob
2 | James
3 | Fred
TABLE 2: orders
order_id | customer_id | order_timestamp
----------------------------------------
1000 | 1 | 2011-01-01 00:00
1001 | 1 | 2011-01-05 00:00
1002 | 2 | 2011-01-10 00:00
Run Code Online (Sandbox Code Playgroud)
现在,以下查询告诉我每个客户下了多少订单:
select c.customer_id, count(o.order_id)
from customers c
left join orders o using (customer_id)
group by 1
customer_id | count
-------------------
1 | 2
2 | 1
3 | 0
Run Code Online (Sandbox Code Playgroud)
这很有用但是如果我在查询中添加一个WHERE子句,即使我正在进行LEFT JOIN,查询也不会为没有下任何订单的客户输出零数:
select c.customer_id, count(o.order_id) …Run Code Online (Sandbox Code Playgroud) 我需要在SQLite中使用标准偏差函数.我在这里找到一个:
http://www.sqlite.org/contrib?orderby=date
但它是SQLite的扩展文件的一部分.我以前从未安装过其中一种,我不知道该怎么做.我在http://www.sqlite.org/lang_corefunc.html找到了这个现有函数load_extension,但我不明白参数X和Y是什么.
基本上,我需要有人给我一个关于如何安装聚合扩展文件的分步指南.谁能这样做?
我想制作一个SQL查询,找到平均评分最高的电影奖项,所以对于一组获得特定奖项的电影,如果他们的平均评分高于其他任何一组电影那么它将被退回.
我试过这样的事情:
SELECT MAX(AVG(m."Rating"))
FROM awards a, movies m
WHERE a."Title" = m."Title"
GROUP BY a."Award"
Run Code Online (Sandbox Code Playgroud)
但似乎聚合函数不能嵌套.如何在每个类别的平均评级上调用max函数?
我正在尝试将一个查询放在一起,该查询将在一段时间内检索用户的统计信息(利润/损失)作为累积结果.
这是我到目前为止的查询:
SELECT p.name, e.date,
sum(sp.payout) OVER (ORDER BY e.date)
- sum(s.buyin) OVER (ORDER BY e.date) AS "Profit/Loss"
FROM result r
JOIN game g ON r.game_id = g.game_id
JOIN event e ON g.event_id = e.event_id
JOIN structure s ON g.structure_id = s.structure_id
JOIN structure_payout sp ON g.structure_id = sp.structure_id
AND r.position = sp.position
JOIN player p ON r.player_id = p.player_id
WHERE p.player_id = 17
GROUP BY p.name, e.date, e.event_id, sp.payout, s.buyin
ORDER BY p.name, e.date ASC
Run Code Online (Sandbox Code Playgroud)
查询将运行.但是,结果略有不正确.原因是一个人event可以有多个游戏(有不同的sp.payouts …
可以说我有一个植物表:
id fruit
1 banana
2 apple
3 orange
Run Code Online (Sandbox Code Playgroud)
我可以做到这些
SELECT * FROM plant ORDER BY id;
SELECT * FROM plant ORDER BY fruit DESC;
Run Code Online (Sandbox Code Playgroud)
这是显而易见的事情.
但我被这个咬了,这有什么作用?
SELECT * FROM plant ORDER BY SUM(id);
SELECT * FROM plant ORDER BY COUNT(fruit);
SELECT * FROM plant ORDER BY COUNT(*);
SELECT * FROM plant ORDER BY SUM(1) DESC;
Run Code Online (Sandbox Code Playgroud)
所有这些只返回第一行(id = 1).
ORDER BY什么?我有这样的代码:
select
tbl.person
,COUNT(distinct tbl.project)
,if (tbl.stage like '%SIGNED%') then sum(tbl.value) else '0' end if as test
from
my_table tbl
group by
1
Run Code Online (Sandbox Code Playgroud)
它返回给我该错误消息:
SQL Error [42601]: ERROR: syntax error at or near "then"
Run Code Online (Sandbox Code Playgroud)
我没明白。正如我在文档中看到的,if 语句语法似乎使用正确
有一组用户。一个人可以拥有多个用户,但ref1和ref2可能相似,因此可以将用户链接在一起。ref1且ref2不重叠,则 中ref1不存在 中的一个值ref2。
一个用户可以拥有多种资产。我想“合并”具有一个或多个相似参考的用户,然后计算他们总共拥有多少资产。用户表中可能缺少条目,在这种情况下,我只想将所有者传播到 ref2 并设置 asset_count 和 asset_ids。
下面是一个示例架构来说明:
示例资产
SELECT * FROM assets;
Run Code Online (Sandbox Code Playgroud)
| ID | 姓名 | 所有者 |
|---|---|---|
| 1 | #1 | A |
| 2 | #2 | 乙 |
| 3 | #3 | C |
| 4 | #4 | A |
| 5 | #5 | C |
| 6 | #6 | d |
| 7 | #7 | e |
| 8 | #8 | d |
| 9 | #9 | A |
| 10 | #10 | A |
| 11 | #11 | z |
用户示例
SELECT * FROM users;
Run Code Online (Sandbox Code Playgroud)
| ID | 用户名 | 参考1 | 参考2 |
|---|---|---|---|
| 1 | 波波 | A | d |
| 2 | 托托 | 乙 | e … |
简单地说,我有一个表,其中包括一个时间戳列.我想获得具有最新(即最大值)时间戳的行.目前我这样做:
SELECT * FROM table ORDER BY timestamp DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
但我宁愿做这样的事情:
SELECT * FROM table WHERE timestamp=max(timestamp)
Run Code Online (Sandbox Code Playgroud)
但是,SQLite拒绝此查询:
SQL error: misuse of aggregate function max()
Run Code Online (Sandbox Code Playgroud)
该文件证实了这一行为(页面底部):
聚合函数只能在SELECT语句中使用.
我的问题是:是否有可能编写一个查询来获取具有最大时间戳的行而不排序选择并将返回的行数限制为1?这似乎应该是可能的,但我想我的SQL-fu不适合鼻烟.
我有一项任务来计算具有评论数> X的用户数量.
我的SQL查询如下所示:
SELECT users.id,
users.display_name,
(SELECT COUNT(*)
FROM cms_comments
WHERE cms_comments.author_id = users.id) AS comments_count
FROM users
HAVING comments_count > 150;
Run Code Online (Sandbox Code Playgroud)
一切都很好,它正确显示所有用户.但我需要查询以一行返回所有这些用户的数量.我不知道如何更改此查询以使其生成正确的数据.
考虑在PostgreSQL中实现的投票系统,其中每个用户可以在"foo"上向上或向下投票.有一种foo存储所有的"富信息"表和votes存储表user_id,foo_id和vote,其中vote是+1或-1.
要获得每个foo的投票结果,以下查询将起作用:
SELECT sum(vote) FROM votes WHERE foo.foo_id = votes.foo_id;
Run Code Online (Sandbox Code Playgroud)
但是,以下内容也可以正常工作:
(SELECT count(vote) FROM votes
WHERE foo.foo_id = votes.foo_id
AND votes.vote = 1)
- (SELECT count(vote) FROM votes
WHERE foo.foo_id = votes.foo_id
AND votes.vote = (-1))
Run Code Online (Sandbox Code Playgroud)
我目前有一个索引votes.foo_id.
哪种方法更有效?(换句话说,哪个会运行得更快?)我对PostgreSQL特定的答案和一般的SQL答案感兴趣.
编辑
很多答案都考虑到了votenull 的情况.我忘了提到NOT NULL投票栏有一个限制.
此外,许多人指出,第一个更容易阅读.是的,这绝对是真的,如果一位同事写了第二篇,我会愤怒地爆发,除非有表演的必要性.从来没有,问题仍然在于两者的表现.(从技术上来说,如果第一个查询方式比较慢,它不会是这种罪行写入第二个查询.)
sql ×10
postgresql ×6
mysql ×2
sqlite ×2
aggregate ×1
arrays ×1
case ×1
graph-theory ×1
sql-order-by ×1
subquery ×1
sum ×1
where-clause ×1