我正在为此苦苦挣扎。我表中有以下数据(实际上还有更多的列要减少到):
问题是如何得到结果?
规则是,我只希望每个子产品仅包含Max(changed)
的一行。
你能帮我吗?
我尝试了Group by Product, subproduct
,但我失败了
帮助!
答案 0 :(得分:0)
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)
按已更改的降序对行进行编号。每当Product + SubProduct组合更改时,编号将从1重新开始
然后我们有一个外部查询,该查询选择所有编号为1的行
之所以起作用,是因为它实际上不是一个团体。分区有点像一个组,但是使用这种技术我们不会丢失任何行-输入中的所有行都会添加到输出中并添加额外的数据。相反,一组丢失数据;如果按产品和子产品分组,则不能在不将其添加到分组键的情况下添加更多列,这会破坏您要创建的组。您可以对分组查询中的列执行的唯一其他操作是在其上运行聚合函数,但是您不能说“让我获得最大更改,并且我想要关联的价格”,您只能要求获得最大更改,和最高价格(或其他价格),它们不一定来自同一行
答案 1 :(得分:0)
请考虑以下内容(将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
,最外面的查询将原始表与子查询选择的记录连接起来。