计算视图中的字段
Calculate fields in a view
我的 MariaDB 数据库中有以下 table 个“数字”:
id
number
1
25
2
41
3
3
4
73
5
38
6
41
7
12
8
14
现在我想创建一个让我看到的视图:
- 第 1 列:所有可能的数字(不同)
- 第 2 列:该数字出现的次数
- 第 3 列:最后一个 ID 与该号码的 ID 之间的 ID 数量。
这将导致此视图:
number
occurrences
IDdifferences
3
1
5
12
1
1
14
1
0
25
1
7
38
1
3
41
2
2
73
1
4
所以我开始:
SELECT DISTINCT number FROM numbers
然后在同一个 table 上左连接到 count ,但这会使查询变慢(而且它没有按我想要的方式工作)。你知道如何解决这个问题吗?非常感谢!
你可以按数字分组并使用 COUNT()
聚合函数获取列 occurrences
和 MAX()
window 函数获取列 IDdifferences
:
SELECT number,
COUNT(*) occurrences,
MAX(MAX(id)) OVER () - MAX(id) IDdifferences
FROM numbers
GROUP BY number
ORDER BY number;
如果id之间有空隙:
SELECT number,
COUNT(*) occurrences,
MAX(MAX(rn)) OVER () - MAX(rn) IDdifferences
FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn FROM numbers) t
GROUP BY number
ORDER BY number;
参见demo。
我的 MariaDB 数据库中有以下 table 个“数字”:
id | number |
---|---|
1 | 25 |
2 | 41 |
3 | 3 |
4 | 73 |
5 | 38 |
6 | 41 |
7 | 12 |
8 | 14 |
现在我想创建一个让我看到的视图:
- 第 1 列:所有可能的数字(不同)
- 第 2 列:该数字出现的次数
- 第 3 列:最后一个 ID 与该号码的 ID 之间的 ID 数量。
这将导致此视图:
number | occurrences | IDdifferences |
---|---|---|
3 | 1 | 5 |
12 | 1 | 1 |
14 | 1 | 0 |
25 | 1 | 7 |
38 | 1 | 3 |
41 | 2 | 2 |
73 | 1 | 4 |
所以我开始:
SELECT DISTINCT number FROM numbers
然后在同一个 table 上左连接到 count ,但这会使查询变慢(而且它没有按我想要的方式工作)。你知道如何解决这个问题吗?非常感谢!
你可以按数字分组并使用 COUNT()
聚合函数获取列 occurrences
和 MAX()
window 函数获取列 IDdifferences
:
SELECT number,
COUNT(*) occurrences,
MAX(MAX(id)) OVER () - MAX(id) IDdifferences
FROM numbers
GROUP BY number
ORDER BY number;
如果id之间有空隙:
SELECT number,
COUNT(*) occurrences,
MAX(MAX(rn)) OVER () - MAX(rn) IDdifferences
FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn FROM numbers) t
GROUP BY number
ORDER BY number;
参见demo。