首页 > 解决方案 > SQL - 具有多个条件的分组集

问题描述

我有一个大型(1500 万条记录)数据库,我们从中生成许多不同的表,我们正在尝试重构我们的代码以在一个基础数据集中生成所有信息。这导致我使用了多个 UNION,它们通常有一个不同的过滤器,或者按一个额外的变量分组。这导致代码很长(我认为总数将是 8 个左右的 UNION)。

我一直在阅读有关分组集的内容,从表面上看,这似乎是解决问题的理想方法。我遇到的问题是 HAVING 子句。我的很多 UNIONS 对相同的变量进行不同的过滤;所以我不确定是否可以设置 HAVING 子句以在一个分组集中包含一个变量子集,在下一个组中包含另一个子集。

一个非常简单的例子。参加音乐比赛的人,您可以使用每种乐器多次参加,也可以使用多种乐器参加。我们的原始数据是每人每条记录一行。我们想为每种乐器取最好的分数:

Select Person_ID, Solo_group, instrument_type, Instrument
, Max (Score) as [Score]
into #Scores
from #Entries
where Solo_group = 1
where instrument in (Flute, guitar, oboe, drums, tuba, violin)
Group by Person_ID, Solo_group, instrument_type, Instrument
UNION
Select Person_ID, Solo_group, instrument_type
, 'Specialist' as [Instrument]
, Max (Score) as [Score]
into #Scores
from #Entries
where Solo_group = 1
where instrument in (Flute, guitar, oboe, drums, tuba, violin)
Group by Person_ID, Solo_group, instrument_type
UNION
Select Person_ID, Solo_group, instrument_type, [Instrument]
, Max (Score) as [Score]
into #Scores
from #Entries
where Solo_group = 0
Group by Person_ID, Solo_group, instrument_type, [Instrument]

代码可能有错误,我只是临时编造的。但问题是: - 第一批在“专业”乐器中为每个人提供每个乐器的最高分数 - 第二批做同样的事情,但对于所有专业乐器的组合 - 第三批包括所有乐器,但包括独奏和团体表演。

所以对于分组集,我很确定我可以使用:

Grouping sets (
      (Person_ID, Solo_group, instrument_type, Instrument),
      (Person_ID, Solo_group, instrument_type)
              )

但是第一个分组集需要以不同的方式应用 solo_group 过滤器(在我的实际代码中,还有更多需要区分的地方)。是否可以使用 HAVING 将 solo_group 变量以不同的方式应用于同一分组集?另外值得注意的是,where 子句中的 [instrument] 过滤器也需要区分。

我刚刚有一个想法,我想我实际上需要三个分组集:

    Grouping sets (
      (Person_ID, Solo_group, instrument_type, Instrument),
      (Person_ID, Solo_group, instrument_type, Instrument),
      (Person_ID, Solo_group, instrument_type)
              )

但是对于第二组来说,有一个额外的变量可以将它与第一组区分开来(例如,一个虚拟变量将其标识为solo_group = 0 组)。那么有三个 HAVING 子句?每组一个?

如果这是可能的,那么 HAVING 原因会是什么样子?我很难弄清楚它们的实际工作方式。

标签: sql

解决方案


推荐阅读