在 SQLite 中,如何对值范围进行分组并对组进行排序

问题描述 投票:0回答:1

在 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
可能不是每个组中最小的。

sql sqlite
1个回答
0
投票

说实话,我不太清楚你的问题。如果我理解正确的话,您希望将值分类为 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;

据我所知,您的问题没有直接答案。正如我所说,我可能错误地解释了你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.