Sqlite group_concat命令

时间:2009-12-13 18:56:56

标签: sqlite group-concat

在Sqlite中我可以使用group_concat来执行:

1...A
1...B
1...C
2...A
2...B
2...C

1...C,B,A
2...C,B,A

但是连词的顺序是随机的 - 根据文档。

我需要将group_concat的输出排序为

1...A,B,C
2...A,B,C

我该怎么做?

3 个答案:

答案 0 :(得分:64)

你能不能在order by子句中使用subselect,然后对这些值进行分组?

这样的东西
SELECT ID, GROUP_CONCAT(Val)
FROM (
   SELECT ID, Val
   FROM YourTable
   ORDER BY ID, Val
   )
GROUP BY ID;

答案 1 :(得分:0)

根据docs,更准确地说:

  

串联元素的顺序是任意的。

这实际上并不是随机的,只是意味着开发人员保留使用其所希望的顺序的权利,甚至针对不同的查询或不同的SQLite版本使用不同的顺序。

在当前版本中,此顺序可能是Adrian Stander的答案所隐含的顺序,因为他的代码似乎确实有效。因此,您可能只是通过一些单元测试来保护自己,并称之为一天。但是,如果没有非常仔细地检查SQLite的源代码,就永远不可能100%地确定这将一直有效。

如果您愿意从源代码构建SQLite,也可以尝试编写自己的user-defined aggregate function,但是有一种更简单的方法。

幸运的是,从3.25.0版开始,您可以使用window functions,尽管可以解决您的问题,但它提供了可以保证工作的效果。

您可以在文档中看到,Windows函数具有自己的ORDER BY子句:

  

在上面的示例中,窗口框架包括上一行(“ 1 PRECEDING”)和下一行(“ 1 FOLLOWING”)之间的所有行,包括下一行,其中各行根据以下内容中的ORDER BY子句进行排序window-defn(在本例中为“ ORDER BY a”)。

请注意,仅此一项并不一定意味着所有聚合函数都遵守窗口框架内部的顺序,但是如果您查看unit tests,您会发现这是实际上是这样:

do_execsql_test 4.10.1 {
  SELECT a, 
    count() OVER (ORDER BY a DESC),
    group_concat(a, '.') OVER (ORDER BY a DESC) 
  FROM t2 ORDER BY a DESC
} {
  6 1 6
  5 2 6.5
  4 3 6.5.4
  3 4 6.5.4.3
  2 5 6.5.4.3.2
  1 6 6.5.4.3.2.1
  0 7 6.5.4.3.2.1.0
}

所以,总结起来,你可以写

SELECT ID, GROUP_CONCAT(Val) OVER (PARTITION BY ID ORDER BY Val) FROM YourTable;

导致:

1|A
1|A,B
1|A,B,C
2|A
2|A,B
2|A,B,C

不幸的是,它还包含所需聚合的每个前缀。相反,您希望将窗口框架指定为始终包含整个范围,然后放弃冗余值,如下所示:

SELECT DISTINCT ID, GROUP_CONCAT(Val)
OVER (PARTITION BY ID ORDER BY Val ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM YourTable;

或类似这样:

SELECT * FROM (
    SELECT ID, GROUP_CONCAT(Val)
    OVER (PARTITION BY ID ORDER BY Val ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
    FROM YourTable
)
GROUP BY ID;

答案 2 :(得分:0)

偶然发现了潜在的排序问题,我试过这个: (...在 10.4.18-MariaDB 上)

select GROUP_CONCAT(ex.ID) as ID_list
FROM (
SELECT usr.ID
FROM (
SELECT u1.ID as ID
FROM table_users u1
) usr
GROUP BY ID
) ex

... 发现序列化的 ID_list 已排序! 但我对这个现在“正确”(?)的结果没有任何解释。