分组和划分 Netezza
Posted
技术标签:
【中文标题】分组和划分 Netezza【英文标题】:Grouping and Dividing Netezza 【发布时间】:2012-10-26 11:36:46 【问题描述】:我有以下查询,它将 sum(rev) 列中的每一行除以该列的总和。
对于以下示例,sum(rev) 列的总和为 23193。除法列由以下公式得出:行 in sum(rev)/sum(rev)
select date,id,sum(rev),
NULLIF(rev,0) / sum(rev) over() as Divide
from test
where month(date) = 11
and year(date) = 2012
and day(date) = 02
and id = 'Client1'
group by date,id,rev
having sum(rev) <> 0
order by date
date id sum(rev) Divide
2012-11-02 00:00:00 Client1 1562.00 0.067348
2012-11-02 00:00:00 Client1 1.00 0.000043
2012-11-02 00:00:00 Client1 4689.00 0.202173
2012-11-02 00:00:00 Client1 267.00 0.011512
2012-11-02 00:00:00 Client1 16674.00 0.718924
有2个问题
1.) 当日期(日期)条件被注释时,检索到的值是错误的。它在除法计算中没有给出正确的值
date sum(rev) Divide
2012-11-02 00:00:00 1.00 0.000002
2012-11-02 00:00:00 267.00 0.000412
2012-11-02 00:00:00 1562.00 0.002412
2012-11-02 00:00:00 4689.00 0.007241
2012-11-02 00:00:00 16674.00 0.025749
2.) 我想按日期分组。因此,由于我们只有 2-11-2012 的记录,因此每天必须只有一行记录
请帮忙修复这两个错误
参考:Find column Value by dividing with sum of a column
【问题讨论】:
这样格式化日期查询的原因是什么? 您能否展示一些示例输入数据和所需的输出。包含多个日期。 请参阅问题中提供的链接以获取示例 请显示一些示例输入和所需的输出。 2.您不是在date
上分组,而是在date,id,rev
上分组,因此date,id,rev
的每个唯一组合都有一行。 1.您必须提供一些样本数据,实际输出和预期输出。仅仅说结果是错误的,还不足以让任何人了解你有什么问题。
【参考方案1】:
如果您想按date
分组并将每日总数除以总计,您可以这样做:
SELECT
date,
SUM(rev) AS total,
SUM(rev) / SUM(SUM(rev)) OVER () AS portion
FROM test
GROUP BY
date
;
也就是说,SUM() OVER ()
的参数应该是一个有效的表达式,而rev
在这个 GROUP BY 查询中不是一个有效的表达式,因为rev
不包含在 GROUP BY 中。但是您可以(并且应该)使用SUM(rev)
作为参数,它会按预期工作。
如果您想为不同的客户端提供不同的结果,请将id
添加到 GROUP BY 子句中,并将PARTITION BY id
添加到窗口 SUM() 的 OVER 子句中,如下所示:
SELECT
date,
id,
SUM(rev) AS total,
SUM(rev) / SUM(SUM(rev)) OVER (PARTITION BY id) AS portion
FROM test
GROUP BY
date,
id
;
详细了解 OVER 子句in the manual。
【讨论】:
NZ 6.0 支持 Analytic 函数,因此该语法也应该在那里工作。以上是关于分组和划分 Netezza的主要内容,如果未能解决你的问题,请参考以下文章
R语言数据集划分(使用随机分组标记分成测试集和训练集)对于数据集中多条数据有关系或者依赖的情况获得分组数据的ID,并为相同分组数据生成相同的抽样ID,之后再抽样生成测试集和训练集