相关疑难解决方法(0)

对于绝对性能,SUM 更快还是 COUNT?

这与计算符合特定条件的记录数有关,例如invoice amount > $100

我倾向于更喜欢

COUNT(CASE WHEN invoice_amount > 100 THEN 1 END)
Run Code Online (Sandbox Code Playgroud)

然而,这同样有效

SUM(CASE WHEN invoice_amount > 100 THEN 1 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)

我认为 COUNT 更可取有两个原因:

  1. 传达意图,即 COUNT
  2. COUNT 可能i += 1某处涉及一个简单的操作,而 SUM 不能指望它的表达式是一个简单的整数值。

有没有人有关于特定 RDBMS 差异的具体事实?

mysql postgresql sqlite oracle sql-server

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

选择最长的连续序列

我正在尝试在 PostgreSQL 9.0 中构建一个查询,该查询获取特定列的最长连续行序列。

考虑下表:

lap_id (serial), lap_no (int), car_type (enum), race_id (int FK)
Run Code Online (Sandbox Code Playgroud)

lap_no每个(race_id, car_type). where都是独一无二的。

我希望查询为给定的race_idand生成最长的序列car_type,因此它将返回int最高的(或长的)。

使用以下数据:

1, 1, red, 1
2, 2, red, 1
3, 3, red, 1
4, 4, red, 1
5, 1, blue, 1
6, 5, red, 1
7, 2, blue, 1
8, 1, green, 1
Run Code Online (Sandbox Code Playgroud)

对于car_type = red and race_id = 1查询将5作为lap_no字段的最长序列返回。

我在这里发现了一个类似的问题但是我的情况更简单一些。

(我也想知道car_type …

postgresql window-functions gaps-and-islands postgresql-9.0

12
推荐指数
2
解决办法
9110
查看次数

用row_number() 和dense_rank() 解决“差距和孤岛”?

如何用解决的孤岛部分。我现在已经看过几次了,我想知道是否有人可以解释一下,dense_rank()row_number()

让我们使用这样的东西作为示例数据(示例使用 PostgreSQL),

CREATE TABLE foo
AS
  SELECT x AS id, trunc(random()*3+1) AS x
  FROM generate_series(1,50)
    AS t(x);
Run Code Online (Sandbox Code Playgroud)

这应该产生这样的东西。

 id | x 
----+---
  1 | 3
  2 | 1
  3 | 3
  4 | 3
  5 | 3
  6 | 2
  7 | 3
  8 | 2
  9 | 1
 10 | 3
...
Run Code Online (Sandbox Code Playgroud)

我们想要的是这样的...... z我们可以使用的价值在哪里GROUP BY

 id | x | grp
----+------
  1 | 3 | z
  2 | …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions gaps-and-islands rank

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

在什么情况下,间隙和岛屿需要计数(x 或空)?

这个答案中,Erwin Brandstetter 说:

count(step OR NULL) OVER (ORDER BY date)是最短的语法,也适用于 Postgres 9.3 或更早版本。count()只计算非空值。在现代 Postgres 中,更简洁、等效的语法是:

count(step) FILTER (WHERE step) OVER (ORDER BY date)
Run Code Online (Sandbox Code Playgroud)

我不确定为什么count(step OR NULL)是首选。在我的查询中,我执行以下操作。我重命名了我的变量以匹配他的同时保持语法。

CASE WHEN lag(id_type) OVER (ORDER BY date) <> id_type THEN 1 END AS step
Run Code Online (Sandbox Code Playgroud)

我们正在计算它返回的值。请注意,case 只能返回 1 或 null。

  • 如果两者不相等,则返回 1。
  • 如果它们相等,则返回不计算在内的 null。

欧文的回答是:

这假设涉及的列是NOT NULL. 否则你需要做更多。

所以我更迷茫了。添加count(step OR NULL)什么来保护我们的查询有什么意义?

任何人都可以分解这一点,也许可以展示两个带有数据的示例,其中只有一个 - 一个 -count(x OR NULL)有效?

postgresql null count window-functions gaps-and-islands

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