SQL:COUNT PARTITION BY

时间:2018-12-17 04:17:44

标签: sql r sql-server tsql

我目前正在预测从仓库到各个商店的物品需求。但是为了进行预测,从仓库到各自的商店,每种产品至少需要有2个时间序列。

目前,我是这样工作的:

SELECT t.date,t.Qty,t.ItemID,t.Warehouse,t.Store 
FROM(SELECT date,
Warehouse,
SUM(Qty),
ItemID,
Store,
Count (*) OVER (PARTITION BY ItemID,Warehouse,Store ) as cnt 
FROM database 
GROUP BY date,Warehouse,ItemID,Store)t 
WHERE cnt >= 2 
ORDER BY t.date DESC;

尽管如此,我使用的预测程序包还是存在错误,因为该数据框具有不到2个要预测的非NA值。这是处理先前df的代码的一部分。

d1 <- df %>% 
nest(-`Warehouse`,-`ItemID`,-`Store`)%>% 
mutate(m = map(data, prophet,algorithm='Newton')) %>%
mutate(future = map(m, make_future_dataframe,freq="week",periods=52)) %>%
mutate(forecast = map2(m, future, predict))
d <- d1 %>% 
unnest(forecast) %>% 
select(date,`Warehouse`, yhat,`ItemID`,`Store`)

3 个答案:

答案 0 :(得分:0)

您的SQL错误-预测程序包必须将其隐藏。数量位于子查询select语句中,但不在group by子句中,并且不被视为汇总。您可能想对其求和,因此带有“数量”的行应为“总和(数量)为数量”。总查询为

SELECT t.date,t.Qty,t.ItemID,t.Warehouse,t.Store 
FROM(SELECT date,
Warehouse,
SUM(Qty) as Qty,
ItemID,
Store,
Count (*) OVER (PARTITION BY ItemID,Warehouse,Store ) as cnt 
FROM database 
GROUP BY date,Warehouse,ItemID,Store)t 
WHERE cnt >= 2 
ORDER BY t.date DESC;

已更新以添加

此(固定)SQL仅返回任何项目/仓库/商店组合至少有两个记录的行。但是,它不是将它们一起返回-只是按日期排序。也许预测程序包期望一个特定组合的所有行都在一起?尝试将结尾处的ORDER BY行更改为

ORDER BY t.ItemID, t.Warehouse, t.Store, t.date DESC;

答案 1 :(得分:0)

请在您的分组依据子句中添加数量

答案 2 :(得分:0)

您的意思是说Forecasting Package正在抛出验证消息。

在所有列上都已使用Count window function时,不需要Group By

这里也有人,他们要么在Group By中包含了QTY,要么在QTY上使用了聚合函数。

主要错误不是因为这个。

如果有小错误,那么您可以纠正自己。

SELECT t.date,t.Qty,t.ItemID,t.Warehouse,t.Store 
FROM(SELECT date,
Warehouse,
sum(Qty) Qty,
ItemID,
Store,
Count (*)  as cnt 
FROM database 
GROUP BY date,Warehouse,ItemID,Store)t 
WHERE cnt >= 2 
ORDER BY t.date DESC;

或者您可能需要在计数中提到columname才能提供准确的计数。

Declare @t table(col int,col1 int)
insert into @t values(null,1),(1,2)

select count(*) from @t

or

select count(col) from @t