【发布时间】:2018-11-23 17:25:04
【问题描述】:
我正在努力解决这个问题。我在表中有以下数据(实际上要减少的列要多得多):
问题是我如何得到结果?
规则是每个子产品只需要一行,只需要Max(changed)。
你能帮帮我吗?
我尝试了Group by Product, subproduct,但失败得很惨
帮助!
【问题讨论】:
标签: sql-server summarize
我正在努力解决这个问题。我在表中有以下数据(实际上要减少的列要多得多):
问题是我如何得到结果?
规则是每个子产品只需要一行,只需要Max(changed)。
你能帮帮我吗?
我尝试了Group by Product, subproduct,但失败得很惨
帮助!
【问题讨论】:
标签: sql-server summarize
考虑以下情况(将Table1 更改为您的表名):
select a.*
from Table1 a inner join
(
select b.product, b.subproduct, max(b.changed) as mc
from Table1 b
group by b.product, b.subproduct
) c on
a.product = c.product and
a.subproduct = c.subproduct and
a.changed = c.mc
子查询选择Product和Subproduct的最新Changed值,最外层的查询将原始表与子查询选择的记录连接起来。
【讨论】:
SELECT * FROM
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY Product, SubProduct ORDER BY Changed DESC) rn FROM table
)
WHERE rn = 1
ROW_NUMBER() OVER(PARTITION BY Product, SubProduct ORDER BY Changed DESC) 按 Changed 的降序对行进行编号。每次Product+SubProduct组合发生变化时,编号从1重新开始
然后我们有一个外部查询,它选择所有编号为 1 的行
之所以可行,是因为它不是一个真正的组。分区有点像一个组,但我们不会使用这种技术丢失任何行 - 输入中的所有行都会通过添加额外的数据进入输出。相反,一个组会丢失数据;如果您按产品和子产品分组,则无法添加更多列而不将它们添加到分组键中,这会破坏您尝试创建的组。您可以对分组查询中的列执行的唯一另一件事是在其上运行聚合函数,但您不能说“给我最大更改,我想要相关价格”您只能要求最大更改,和最高价格(或其他),它们不一定来自同一行
【讨论】: