我正在尝试此处回答的一个版本:获取值在 MySQL 值范围内的行数。但是,我试图计算的行位于联接内,据我所知,我需要能够将联接分配给别名,但我不知道该怎么做。 FWIW,我正在使用 duckdb,但应该不会有问题,因为它接受 SQL 查询。
假设我的数据是这样的:
表1:
id | 瓦尔 |
---|---|
1 | 1 |
2 | 1 |
3 | 3 |
4 | 2 |
表2:
id | 话 |
---|---|
1 | 富 |
1 | 酒吧 |
2 | 巴兹 |
3 | 努 |
4 | 旧 |
我想获得 1 val 内所有单词的计数。我想在对相同的 id 进行内部联接并聚合之后,结果应该如下所示:
加入并统计表:
id | 瓦尔 | 话 | cnt |
---|---|---|---|
1 | 1 | 富 | 4 |
1 | 1 | 酒吧 | 4 |
2 | 1 | 巴兹 | 4 |
3 | 3 | 努 | 2 |
4 | 2 | 旧 | 5 |
从原来的问题类推,我的查询如下。请注意,我已将
INNER JOIN
部分括起来,试图将其分配给变量/别名,以便我可以在 LEFT JOIN
: 期间引用它
SELECT
id,
val,
words,
COUNT(*) AS cnt
FROM (Table1
INNER JOIN Table2
ON Table1.id=Table2.id) t1
LEFT JOIN t1 t2
ON ABS(t1.val - t2.val) <= 1
GROUP BY
t1.val, t1.id;
DuckDb 支持 CTE,因此您首先需要处理 t1 并将其用作计算源
WITH t1 AS
( SELECT t1.id, t1.val,t2.words
FROM Table1 t1
INNER JOIN Table2 t2
ON t1.id=t2.id)
SELECT
t1.id,
t1.val,
t1.words,
COUNT(*) AS cnt
FROM t1
LEFT JOIN t1 t2
ON ABS(t1.val - t2.val) <= 1
GROUP BY
t1.val, t1.id,t1.words;
id | 瓦尔 | 话 | cnt |
---|---|---|---|
1 | 1 | 富 | 4 |
1 | 1 | 酒吧 | 4 |
2 | 1 | 巴兹 | 4 |
3 | 3 | 努 | 2 |
4 | 2 | 旧 | 5 |