Sql server 包含镜像值的列的SQL GROUP BY
对不起,标题不好。我想不出更好的方式来描述我的问题 我有下表:Sql server 包含镜像值的列的SQL GROUP BY,sql-server,group-by,aggregate,Sql Server,Group By,Aggregate,对不起,标题不好。我想不出更好的方式来描述我的问题 我有下表: Category | A | B A | 1 | 2 A | 2 | 1 B | 3 | 4 B | 4 | 3 我想按Category对数据进行分组,每个类别只返回一行,但同时提供列A和B的值 所以结果应该是这样的: category | resultA | resultB A | 1 | 2 B | 4 | 3 如何做
Category | A | B
A | 1 | 2
A | 2 | 1
B | 3 | 4
B | 4 | 3
我想按
Category
对数据进行分组,每个类别只返回一行,但同时提供列A
和B
的值
所以结果应该是这样的:
category | resultA | resultB
A | 1 | 2
B | 4 | 3
如何做到这一点
我试过这样的说法:
SELECT category, a, b
FROM table
GROUP BY category
但很明显,我有以下错误:
列“a”在选择列表中无效,因为它未包含
在聚合函数或GROUP BY子句中
列“b”在选择列表中无效,因为它不包含在
聚合函数或GROUPBY子句
如何实现所需的结果?考虑到您希望从每个
类别的副本中随机记录
下面是一个使用表值构造函数和行数
窗口函数的技巧
;with cte as
(
SELECT *,
(SELECT Min(min_val) FROM (VALUES (a),(b))tc(min_val)) min_val,
(SELECT Max(max_val) FROM (VALUES (a),(b))tc(max_val)) max_val
FROM (VALUES ('A',1,2),
('A',2,1),
('B',3,4),
('B',4,3)) tc(Category, A, B)
)
select Category,A,B from
(
Select Row_Number()Over(Partition by category,max_val,max_val order by (select NULL)) as Rn,*
From cte
) A
Where Rn = 1
考虑到您希望从每个类别的副本中随机记录一条
下面是一个使用表值构造函数和行数
窗口函数的技巧
;with cte as
(
SELECT *,
(SELECT Min(min_val) FROM (VALUES (a),(b))tc(min_val)) min_val,
(SELECT Max(max_val) FROM (VALUES (a),(b))tc(max_val)) max_val
FROM (VALUES ('A',1,2),
('A',2,1),
('B',3,4),
('B',4,3)) tc(Category, A, B)
)
select Category,A,B from
(
Select Row_Number()Over(Partition by category,max_val,max_val order by (select NULL)) as Rn,*
From cte
) A
Where Rn = 1
试试这个:
SELECT category, MIN(a) AS resultA, MAX(a) AS resultB
FROM table
GROUP BY category
如果镜像了这些值,则可以使用MIN
,MAX
将这两个值应用于单个列,如a
,尝试以下操作:
SELECT category, MIN(a) AS resultA, MAX(a) AS resultB
FROM table
GROUP BY category
如果值被镜像,则可以使用<代码> min <代码>两个值,<代码> max >代码>应用于一个列,如<代码> < < /C> >
SEAM,您不想聚合每个类别,而是从结果中删除重复行(或者更确切地说,您认为重复的行)。
你考虑一对(x,y)等于对(y,x)。要查找重复项,可以将较小的值放在第一位,将较大的值放在第二位,然后对行应用
DISTINCT
:
select distinct
category,
case when a < b then a else b end as attr1,
case when a < b then b else a end as attr2
from mytable;
选择distinct
类别
当a< /代码> SeAMs,您不想聚合每个类别,而是从结果中删除重复行(或者更确切地说,您认为重复的行)。
你考虑一对(x,y)等于对(y,x)。要查找重复项,可以将较小的值放在第一位,将较大的值放在第二位,然后对行应用
DISTINCT
:
select distinct
category,
case when a < b then a else b end as attr1,
case when a < b then b else a end as attr2
from mytable;
选择distinct
类别
当a
您能再解释一下您的预期输出吗?为什么A=1,4被保留,而2,3被删除?是否要为每个类别保留任何一行?选择a和b中要显示哪些值的标准是什么?如果有三行包含一个类别,那么这两行{5,5}会是什么结果?“我想按类别对数据进行分组”-你真的这样认为吗?每个类别一个结果行,无论值是什么?到目前为止,每个类别只显示一个属性对的数据(1表示A,2表示A;3表示B,4表示B)。请显示每个类别的更多记录,并告诉我们这对预期结果的影响。您能再解释一下您的预期输出吗?为什么A=1,4被保留,而2,3被删除?是否要为每个类别保留任何一行?选择a和b中要显示哪些值的标准是什么?如果有三行包含一个类别,那么这两行{5,5}会是什么结果?“我想按类别对数据进行分组”-你真的这样认为吗?每个类别一个结果行,无论值是什么?到目前为止,每个类别只显示一个属性对的数据(1表示A,2表示A;3表示B,4表示B)。请为每个类别显示更多记录,并告诉我们这将如何影响预期结果。这不会产生预期的输出(这可能毫无意义)。这不会提供a列和b列的输出,也不会解决返回哪些值的问题。@Simon实际上,我想这可能真的是OP想要的,但是它与预期的输出不匹配。@Tim OP表示他想要的是A和B的值,而不是A的最小值和最大值。不管怎样,我同意它不会在这里提供预期的输出。OP。那么最小/最大组合实际上就是我想要的。我通过另一个查询确保每个类别的可用条目不超过两个。因此,min/max将始终捕获这两个值并生成预期输出。这不会生成预期输出(当然可能没有任何意义)。这不会提供a列和b列的输出,也不会解决返回哪些值的问题。@Simon实际上,我认为这可能真的是OP想要的,但是它与预期的输出不匹配。@Tim OP表示他想要的是A和B的值,而不是A的最小值和最大值。不管怎样,我同意它不会在这里提供预期的输出。OP。那么最小/最大组合实际上就是我想要的。我通过另一个查询确保每个类别的可用条目不超过两个。因此,min/max将始终捕获这两个值并产生预期的输出。有趣的逻辑开关,但将返回非镜像逻辑开关,也将返回非镜像逻辑开关