【问题标题】:How to get a fixed amount of results per row?如何获得每行固定数量的结果?
【发布时间】:2012-03-27 02:52:27
【问题描述】:

如何使用 sqlite3 数据库构建具有这种格式的查询?

CREATE TABLE sample (integer foo);
INSERT INTO sample VALUES (1);
...
INSERT INTO sample VALUES (10);

结果的格式

1,2,3
4,5,6
7,8,9
10

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    您必须添加一些条件来对它们进行分组:

    CREATE TABLE sample (integer foo, char(1) bar);
    INSERT INTO sample VALUES
    (1, 'a'), (2, 'a'), (3, 'a'), (4, 'b'), (5, 'b'), (6, 'b'), (7, 'c') ...;
    
    SELECT GROUP_CONCAT(foo ORDER BY foo, ',')
    FROM sample
    GROUP BY bar
    

    编辑:

    试试这个:

    select group_concat(foo) from (
      select s1.foo, (count(*) - 1) / 3 grp from sample s1
      join sample s2 on s1.rowid >= s2.rowid
      group by s1.rowid
    ) final
    group by grp
    

    【讨论】:

    • 这是一个很好的选择,我在这种情况下使用的实际数据不会发生太大变化,但是如果删除一个,我将不得不实现一个逻辑单元以将新值包含到该组中没有三个成员,也不是最新的。但是谢谢你的另一个观点:)
    • 我添加了另一个答案。因为它是动态计算的,所以它应该在删除后仍然存在
    【解决方案2】:

    这可能不是最好的解决方案(并且有一些极端情况——如果你有一个不为空的 3 值),并且可能可以放入一个查询中,但我需要 RowId 加入。不过,它应该可以解决问题:

    CREATE TEMP TABLE split1 (foo1 int);
    CREATE TEMP TABLE split2 (foo2 int);
    CREATE TEMP TABLE split3 (foo3 int);
    
    INSERT INTO split1
    SELECT foo FROM sample WHERE foo % 3 = 1 ORDER BY foo
    
    INSERT INTO split2
    SELECT foo FROM sample WHERE foo % 3 = 2 ORDER BY foo
    
    INSERT INTO split3
    SELECT foo FROM sample WHERE foo % 3 = 0 ORDER BY foo
    
    SELECT 
        CASE 
            WHEN foo2 IS NULL THEN foo1
            WHEN foo3 IS NULL THEN foo1||','||foo2
            ELSE foo1||','||foo2||','||foo3
        END
    FROM split1
        LEFT JOIN split2 
            ON split1.RowId = split2.RowId
        LEFT JOIN split3
            ON split2.RowId = split3.RowId
    

    【讨论】:

    • 我相信这种方式会更加高效地在代码中循环实现这个逻辑。我可以下订单来简化通话。非常感谢这个任务应该退出查询“魔术”一行不是吗?
    • @ErlonCabral 您没有将其声明为要求。让我看看我能做什么
    • @ErlonCabral 抱歉,这必须是视图,还是可以是无参数存储过程?否则,这将需要递归查询,并且根据stackoverflow.com/questions/7456957/… ...这在 SQLite 中是不可能的。您将不得不在您的代码库中执行此操作...或者您可以执行 Mostacho 的实现并确保每个都附加到一个分组...这很麻烦...这些似乎是您唯一的选择跨度>
    猜你喜欢
    • 2023-01-10
    • 2012-11-30
    • 2012-03-31
    • 2021-10-02
    • 2017-07-31
    • 1970-01-01
    • 2021-08-21
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多