当存在具有唯一数据的列时如何分组(SQL 服务器)
How to group by when there is a column with unique data (SQL Server)
我正在尝试将选择的行组合在一起,这些行在 SQL 服务器中具有唯一列。
目前所有数据都被选为标准二维 table 正在排序的是 Javascript,但是,对于大型列表来说速度很慢,因为 JSON相当大。
我希望通过在服务器端转换数据集来提高前端性能,以便 DOM 更快地呈现。
我认为这可以通过 SQLs group by
功能的某种组合来实现,并可能在 SQL 的较新版本中加入一些较新的功能,如 openjson
服务器。
例子Table
| a | b | c | uniqueColumn |
|---|---|---|---------------|
| 1 | 2 | 3 | string1 |
| 1 | 2 | 3 | string2 |
| 4 | 5 | 6 | string3 |
例子Select
select
uniqueColumn
group by
a,
b,
c
期望输出
| uniqueSelection1 | uniqueSelection2 |
|------------------|------------------|
| string1 | string3 |
| string2 | |
当数据集的一部分是唯一的时,如何将每个唯一组合 a-b-c
分组到其自己的集合中?
您需要使用函数将这些 json 连接成一列。可能是 STUFF,但是如果您有更新版本的 sql 服务器,它可能是 STRING_AGG。查看下面的示例
SELECT a, b, c, STUFF((SELECT N', ' + s.[CITY] FROM yourTable s
WHERE s.a = st.a
AND s.b = st.b
AND s.c = st.c
FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'')
FROM yourTable st
GROUP BY a, b, c
要获得上述 N 列所需结果的输出,其中 N
是唯一 a,b,c
值的数量,这将很困难。您在应用程序端的处理速度可能比在 SQL 服务器端编写和执行动态枢轴所需的速度更快。
相反,如果您有较新的 SQL 服务器,也许使用 FOR JSON AUTO
功能可能会有所帮助,即使它与您想要的输出不完全一样:
SELECT DISTINCT (
SELECT uniqueColumn
FROM yourtable
WHERE a = t.a
AND b = t.b
AND c = t.c
FOR JSON AUTO
) AS e
FROM yourtable t;
举个例子:
CREATE TABLE test (a int, b int, c int, d varchar(30));
INSERT INTO test VALUES (1,2,3,'string1');
INSERT INTO test VALUES (1,2,3,'string2');
INSERT INTO test VALUES (4,5,6,'string3');
SELECT DISTINCT (SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c FOR JSON AUTO) as e FROM test t;
+-----------------------------------+
| e |
+-----------------------------------+
| [{"d":"string1"},{"d":"string2"}] |
| [{"d":"string3"}] |
+-----------------------------------+
如果您想通过导致此输出的独特 a,b,c
选择,您可以这样做:
SELECT DISTINCT a,b,c,
(SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c FOR JSON AUTO) as e
FROM test t
FOR JSON AUTO;
[{"a":1,"b":2,"c":3,"e":[{"d":"string1"},{"d":"string2"}]},{"a":4,"b":5,"c":6,"e":[{"d":"string3"}]}]
或者得到 table 和 json 的混合结果:
SELECT DISTINCT a,b,c,
(SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c
FOR JSON AUTO) as e
FROM test t;
+---+---+---+-----------------------------------+
| a | b | c | e |
+---+---+---+-----------------------------------+
| 1 | 2 | 3 | [{"d":"string1"},{"d":"string2"}] |
| 4 | 5 | 6 | [{"d":"string3"}] |
+---+---+---+-----------------------------------+
如果您想从 json 数组中释放那些 d
输出,您也可以使用 FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
。最后一个查询的输出将是
[{"a":1,"b":2,"c":3,"e":"{\"d\":\"string1\"},{\"d\":\"string2\"}"},{"a":4,"b":5,"c":6,"e":"{\"d\":\"string3\"}"}]
快速解释正在发生的事情:
本质上,对于 d
列(您的 uniqueString)的子查询,我们正在做类似的事情:
SELECT a,b,c,AGGREGATE_IN_JSON(d) FROM yourtable GORUP BY a,b,c;
只是语法要求我们在子查询中AGGREGATE_IN_JSON
组成公式。
我正在尝试将选择的行组合在一起,这些行在 SQL 服务器中具有唯一列。
目前所有数据都被选为标准二维 table 正在排序的是 Javascript,但是,对于大型列表来说速度很慢,因为 JSON相当大。
我希望通过在服务器端转换数据集来提高前端性能,以便 DOM 更快地呈现。
我认为这可以通过 SQLs group by
功能的某种组合来实现,并可能在 SQL 的较新版本中加入一些较新的功能,如 openjson
服务器。
例子Table
| a | b | c | uniqueColumn |
|---|---|---|---------------|
| 1 | 2 | 3 | string1 |
| 1 | 2 | 3 | string2 |
| 4 | 5 | 6 | string3 |
例子Select
select
uniqueColumn
group by
a,
b,
c
期望输出
| uniqueSelection1 | uniqueSelection2 |
|------------------|------------------|
| string1 | string3 |
| string2 | |
当数据集的一部分是唯一的时,如何将每个唯一组合 a-b-c
分组到其自己的集合中?
您需要使用函数将这些 json 连接成一列。可能是 STUFF,但是如果您有更新版本的 sql 服务器,它可能是 STRING_AGG。查看下面的示例
SELECT a, b, c, STUFF((SELECT N', ' + s.[CITY] FROM yourTable s
WHERE s.a = st.a
AND s.b = st.b
AND s.c = st.c
FOR XML PATH(''),TYPE)
.value('text()[1]','nvarchar(max)'),1,2,N'')
FROM yourTable st
GROUP BY a, b, c
要获得上述 N 列所需结果的输出,其中 N
是唯一 a,b,c
值的数量,这将很困难。您在应用程序端的处理速度可能比在 SQL 服务器端编写和执行动态枢轴所需的速度更快。
相反,如果您有较新的 SQL 服务器,也许使用 FOR JSON AUTO
功能可能会有所帮助,即使它与您想要的输出不完全一样:
SELECT DISTINCT (
SELECT uniqueColumn
FROM yourtable
WHERE a = t.a
AND b = t.b
AND c = t.c
FOR JSON AUTO
) AS e
FROM yourtable t;
举个例子:
CREATE TABLE test (a int, b int, c int, d varchar(30));
INSERT INTO test VALUES (1,2,3,'string1');
INSERT INTO test VALUES (1,2,3,'string2');
INSERT INTO test VALUES (4,5,6,'string3');
SELECT DISTINCT (SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c FOR JSON AUTO) as e FROM test t;
+-----------------------------------+
| e |
+-----------------------------------+
| [{"d":"string1"},{"d":"string2"}] |
| [{"d":"string3"}] |
+-----------------------------------+
如果您想通过导致此输出的独特 a,b,c
选择,您可以这样做:
SELECT DISTINCT a,b,c,
(SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c FOR JSON AUTO) as e
FROM test t
FOR JSON AUTO;
[{"a":1,"b":2,"c":3,"e":[{"d":"string1"},{"d":"string2"}]},{"a":4,"b":5,"c":6,"e":[{"d":"string3"}]}]
或者得到 table 和 json 的混合结果:
SELECT DISTINCT a,b,c,
(SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c
FOR JSON AUTO) as e
FROM test t;
+---+---+---+-----------------------------------+
| a | b | c | e |
+---+---+---+-----------------------------------+
| 1 | 2 | 3 | [{"d":"string1"},{"d":"string2"}] |
| 4 | 5 | 6 | [{"d":"string3"}] |
+---+---+---+-----------------------------------+
如果您想从 json 数组中释放那些 d
输出,您也可以使用 FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
。最后一个查询的输出将是
[{"a":1,"b":2,"c":3,"e":"{\"d\":\"string1\"},{\"d\":\"string2\"}"},{"a":4,"b":5,"c":6,"e":"{\"d\":\"string3\"}"}]
快速解释正在发生的事情:
本质上,对于 d
列(您的 uniqueString)的子查询,我们正在做类似的事情:
SELECT a,b,c,AGGREGATE_IN_JSON(d) FROM yourtable GORUP BY a,b,c;
只是语法要求我们在子查询中AGGREGATE_IN_JSON
组成公式。