【问题标题】:How do you group a table of strings using one column to group but aggregating on another column?您如何使用一列对字符串表进行分组但在另一列上聚合?
【发布时间】:2021-11-27 22:12:19
【问题描述】:

场景是我有一个看起来像这样的表格,其中包含书籍 ID、英文和/或法文标题以及它们的销量。还有一些空值。有些书只有英文或法文标题。有的可能两者兼有或两者兼有。

ID Title Language Sales
12345 Sorceror's Stone English 50,000,000
12345 Philosopher's Stone English 50,000,000
12345 A L'ecole de sorcier French 50,000,000
33333 NULL NULL NULL
67890 A Christmas Carol English 65,000,000
67890 Un Chant de Noel French 65,000,000
24680 La Fascination French 30,000,000
24680 La Crépuscule French 30,000,000
13579 NULL NULL NULL

基本上,我想将这个表缩小如下:

  1. 如果至少存在 1 个英文标题,我们需要按字母顺序排列的第一个英文标题。
  2. 否则,如果至少存在 1 个法语标题,我们需要按字母顺序排列的第一个法语标题。
  3. 否则,只要字符串为空即可。

我希望我的结果表看起来像:

ID Title Language Sales
12345 Philosopher's Stone English 50,000,000
33333 null null null
67890 A Christmas Carol English 65,000,000
24680 La Crépuscule French 30,000,000
13579 null null null

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 这能回答你的问题吗? Get top 1 row of each group

标签: sql sql-server tsql


【解决方案1】:

使用row_number解析窗函数:

with title as (
    select * , 
        Row_Number() over(partition by id order by case when [Language]='English' then 0 else 1 end, title) rn
    from t
)
select id, title, [language], Sales
from title
where rn=1

【讨论】:

  • 开窗函数几乎总是这种“任意重复记录”问题的答案,而其他一些像秩、密集秩等有时更有用。对于 Asker 的参考,“with * as”语法是 CTE,在这些情况下通常也需要,因为您有时必须对结果应用窗口或分组。它可以通过子查询来完成,但使用 CTE 更容易阅读,您也可以自己运行 CTE 来调试或理解查询的每个步骤。
猜你喜欢
  • 1970-01-01
  • 2019-05-13
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
相关资源
最近更新 更多