在 SQLite 中,我有一个包含 3 列的表:
id
、value
(整数)和 sort_me
。我想要查询的是 value
在 +-50 范围内的行组,并按 sort_me
升序对每个组内和组间的所有内容进行排序。如果一个组仅由一名成员组成,请将其丢弃。
这是一个示例表:
id, value, sort_me
1, 1, 15
2, 102, 22
3, 3, 7
4, 101, 13
5, 312, 53
6, 6, 34
7, 309, 3
8, 104, 9
9, 521, 8
预期的结果应该是
7,5
3,1,6
8,4,2
到目前为止我想出了
SELECT concat_ws(',', v1.id, group_concat(v2.id ORDER BY v2.sort_me ASC))
FROM t v1, t v2
WHERE v1.id < v2.id AND abs(v1.value - v2.value) < 50
GROUP BY v1.id
ORDER BY v1.sort_me ASC
哪个产量
3,6
4,8
1,3,6
2,8,4
5,7
这在很多方面显然都是错误的。首先,除了完整的组之外,还有一些子组。其次,
group_concat()
内部的排序只影响v2
,而v1
总是先出现。第三,各组之间的顺序也是错误的,因为v1.sort_me
可能不是每个组中最小的。
说实话,我不太清楚你的问题。如果我理解正确的话,您希望将值分类为 50 的区间,例如 1-50、51-100、101-150 等。之后,您希望根据这些间隔对 ID 进行分组,并根据“sort_me”列对它们进行排序。除此之外,您还需要计算每个组中 id 的数量,并丢弃 1 或更少的 id。如果这就是您正在寻找的内容,那么您可以尝试以下查询,
WITH Intervals AS (
SELECT
id,
CASE
WHEN value BETWEEN 1 AND 50 THEN '1-50'
WHEN value BETWEEN 51 AND 100 THEN '51-100'
WHEN value BETWEEN 101 AND 150 THEN '101-150'
-- Add more intervals as needed
ELSE 'Unknown'
END AS value_interval,
sort_me
FROM
your_table
)
SELECT
value_interval,
GROUP_CONCAT(id ORDER BY sort_me) AS grouped_ids,
COUNT(*) AS num_ids
FROM
Intervals
GROUP BY
value_interval
HAVING
num_ids > 1
ORDER BY
value_interval;
据我所知,您的问题没有直接答案。正如我所说,我可能错误地解释了你的问题。