SQL-具有多个条件的分组集

时间:2019-02-26 18:10:05

标签: sql

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

我一直在阅读有关分组集的信息,从表面上看,这似乎是解决该问题的理想解决方案。我的问题在于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]

代码可能有错误,我只是在动态中进行了弥补。但是问题是: -第一批给每个人在“专家”乐器中的最高得分 -第2批处理相同的操作,但对于所有专业仪器而言 -第三批包含所有乐器,但包括个人演奏和小组演奏。

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

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的原因将是什么样?我在确定它们的实际工作方式时遇到了麻烦。

0 个答案:

没有答案