【问题标题】:SQL GROUP BY with columns which contain mirrored valuesSQL GROUP BY 与包含镜像值的列
【发布时间】:2017-02-03 14:52:05
【问题描述】:

抱歉标题不好。我想不出更好的方式来描述我的问题。

我有下表:

Category | A | B
A        | 1 | 2
A        | 2 | 1
B        | 3 | 4
B        | 4 | 3

我想按Category 对数据进行分组,每个类别只返回1 行,但同时提供AB 列的值。

所以结果应该是这样的:

category | resultA | resultB
A        | 1       | 2
B        | 4       | 3

如何做到这一点?

我试过这个说法:

SELECT category, a, b
FROM table
GROUP BY category

但显然,我收到以下错误:

选择列表中的列“a”无效,因为它不包含在内 在聚合函数或 GROUP BY 子句中。

选择列表中的“b”列无效,因为它不包含在任何一个 聚合函数或 GROUP BY 子句。

我怎样才能达到预期的效果?

【问题讨论】:

  • 你能解释一下你的预期输出吗?为什么保留 A = 1、4 而删除 2、3?您想为每个类别保留任何一行吗?
  • 选择要显示的 a 和 b 中的哪些值的标准是什么?
  • 如果有 3 行 A 类,这对 {5, 5} 会是什么结果?
  • “我想按类别对数据进行分组” - 你真的吗?每个类别一个结果行,不管是什么值?到目前为止,您只显示每个类别具有一个属性对的数据(A 为 1 和 2;B 为 3 和 4)。请按类别显示更多记录,并告诉我们这对预期结果有何影响。

标签: sql-server group-by aggregate


【解决方案1】:

试试这个:

SELECT category, MIN(a) AS resultA, MAX(a) AS resultB
FROM table
GROUP BY category

如果这些值是镜像的,那么您可以使用 MINMAX 来获取这两个值,并将其应用于单个列,例如 a

【讨论】:

  • 这不会产生预期的输出(诚然这可能没有任何意义)。
  • 这不是提供列 a 和 b 的输出,也不是解决返回哪些值的问题。
  • @Simon 实际上,我认为这可能确实是 OP 想要的,但它与预期的输出不匹配。
  • @Tim OP 声明他想要 A 和 B 的值,而不是 A 的最小值和最大值。无论哪种方式,我都同意它不会提供预期的输出。
  • 在这里操作。然后最小/最大组合实际上是我想要的。我通过另一个查询确保每个类别不超过两个可用的条目。因此 min/max 将始终捕获两个值并产生预期的输出。
【解决方案2】:

您并不真正想按类别汇总接缝,而是从结果中删除重复的行(或者更确切地说是您认为重复的行)。

你认为 (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;

【讨论】:

  • 有趣的逻辑开关,但也会返回非镜像
【解决方案3】:

考虑到您希望从每个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2023-03-06
    • 1970-01-01
    • 2018-04-11
    • 2010-09-30
    相关资源
    最近更新 更多