抱歉标题不好。我无法想出一个更好的方式来描述我的问题。
我有下表:
Category | A | B
A | 1 | 2
A | 2 | 1
B | 3 | 4
B | 4 | 3
我想按Category
对数据进行分组,每个类别只返回1行,但同时提供列A
和B
的值。
所以结果应该是这样的:
category | resultA | resultB
A | 1 | 2
B | 4 | 3
如何实现这一目标?
我试过这句话:
SELECT category, a, b
FROM table
GROUP BY category
但很明显,我收到以下错误:
专栏' a'在选择列表中无效,因为它未包含 在聚合函数或GROUP BY子句中。
专栏' b'在选择列表中无效,因为它不包含在任何一个中 聚合函数或GROUP BY子句。
如何达到预期效果?
答案 0 :(得分:3)
试试这个:
SELECT category, MIN(a) AS resultA, MAX(a) AS resultB
FROM table
GROUP BY category
如果镜像了这些值,那么您可以使用MIN
,MAX
应用于a
等单个列来获取这两个值。
答案 1 :(得分:3)
您不希望按类别聚合,而是从结果中删除重复的行(或者您认为重复的行)。
您认为一对(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;
答案 2 :(得分:2)
考虑到您希望每个category
的重复项都有随机记录。
这是使用表值构造函数和Row_Number
窗口函数
;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