首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否基于规则对数据集进行分组?

是否基于规则对数据集进行分组?
EN

Stack Overflow用户
提问于 2021-02-25 18:16:45
回答 2查看 36关注 0票数 0

我有下面的数据集:

代码语言:javascript
复制
Zone    Car      FiscalYear Rating  FinalRating     Year   Bool
----------------------------------------------------------------
Zone1   Mercedes    2020    green     green          2020   1
Zone1   Mercedes    2020    green     green          2021   0
Zone1   Mercedes    2021    green     green          2020   0
Zone1   Mercedes    2021    amber     amber          2021   1
Zone2   BMW         2020    amber     amber          2020   1
Zone2   BMW         2021    green     green          2020   0
Zone2   Skoda       2020    amber     amber          2020   1
Zone2   Skoda       2021    green     green          2020   0

我试图实现的是按区域、汽车和FiscalYear对数据进行分组。如果我们复制了要分组的会计年度,我想选择Bool = 1的行,基本上fiscalYear等于Year,但仅在需要分组的情况下。这就是我想要达到的目标:

代码语言:javascript
复制
Zone    Car      FiscalYear Rating  FinalRating     Year   Bool
----------------------------------------------------------------
Zone1   Mercedes    2020    green     green          2020   1
Zone1   Mercedes    2021    amber     amber          2021   1
Zone2   BMW         2020    amber     amber          2020   1
Zone2   BMW         2021    green     green          2020   0
Zone2   Skoda       2020    amber     amber          2020   1
Zone2   Skoda       2021    green     green          2020   0

我使用的是SQL Server 2014。我尝试使用分区和不同的分组规则,但没有成功。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-25 18:24:41

如果我没理解错的话,你不需要分组。您只需要为每个组选择一行,因此可以选择将ROW_NUMBER()与适当的PARTITION BYORDER BY子句一起使用:

代码语言:javascript
复制
SELECT Zone, Car, FiscalYear, Rating, FinalRating, Year, Bool
FROM (
   SELECT 
      *,
      ROW_NUMBER() OVER (PARTITION BY Zone, Car, FiscalYear ORDER BY Bool DESC) AS Rn
   FROM (VALUES
      ('Zone1', 'Mercedes', '2020', 'green', 'green', 2020, 1),
      ('Zone1', 'Mercedes', '2020', 'green', 'green', 2021, 0),
      ('Zone1', 'Mercedes', '2021', 'green', 'green', 2020, 0),
      ('Zone1', 'Mercedes', '2021', 'amber', 'amber', 2021, 1),
      ('Zone2', 'BMW',      '2020', 'amber', 'amber', 2020, 1),
      ('Zone2', 'BMW',      '2021', 'green', 'green', 2020, 0),
      ('Zone2', 'Skoda',    '2020', 'amber', 'amber', 2020, 1),
      ('Zone2', 'Skoda',    '2021', 'green', 'green', 2020, 0)
   ) v (Zone, Car, FiscalYear, Rating, FinalRating, Year, Bool)   
) t
WHERE Rn = 1

结果:

代码语言:javascript
复制
Zone  Car      FiscalYear RatingFinalRating Year Bool
Zone1 Mercedes 2020       green  green      2020 1
Zone1 Mercedes 2021       amber  amber      2021 1
Zone2 BMW      2020       amber  amber      2020 1
Zone2 BMW      2021       green  green      2020 0
Zone2 Skoda    2020       amber  amber      2020 1
Zone2 Skoda    2021       green  green      2020 0
票数 2
EN

Stack Overflow用户

发布于 2021-02-25 19:24:30

编写此代码的最快方法可能是:

代码语言:javascript
复制
select top 1 with ties Zone, Car, FiscalYear, Rating, FinalRating, Year, Bool
from yourtable t
order by row_number() over (PARTITION BY Zone, Car, FiscalYear ORDER BY Bool DESC) desc
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66366597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档