每个订单之前某种类型的订单数量
number of orders of certain type before every order
一个客户有订单,每个订单都是类型 1 或类型 2。我想计算每种类型在每个订单之前 出现的次数。
例如一位客户:
customer | orders| Type
---------+-------------
customerA| Order1| 1
customerA| Order2| 1
CustomerA| Order3| 2
customerA| Order1| 1
customerA| Order2| 2
customerA| Order3| 2
CustomerA| Order1| 1
customerA| Order2| 2
所需结果:
customer | orders| Type| Nr_typ1| Nr_typ2
---------+-------+-----+--------+-------
customerA| Order1| 1 | 0 | 0
customerA| Order2| 1 | 1 | 0
CustomerA| Order3| 2 | 2 | 0
customerA| Order1| 1 | 2 | 1
customerA| Order2| 2 | 3 | 1
customerA| Order3| 2 | 3 | 2
CustomerA| Order1| 1 | 3 | 3
customerA| Order2| 2 | 4 | 3
我尝试的是:
select t.customer, t.orders, t.type, sum(t.type1), sum(t.type2) from
(select customer, orders, type,
case type = 1 then 1 else 0 end as type1,
case type = 2 then 1 else 0 end as type2
from table customer_orders) t group by customer, orders, type
如有任何建议,我们将不胜感激!谢谢
您可以在 SQL 中使用 with WHILE
循环,如下所示。 (#order是我的订单table,你改成你实际的table)
创建 table 以存储结果:
CREATE TABLE #res
(customer varchar(100),
orders varchar(100),
[type] int,
Nr_typ1 int,
Nr_typ2 int)
为WHILE
循环声明一些变量和游标:
DECLARE @Customer varchar(100), @Order varchar(100), @Type int, @nr_type1 int = 0, @nr_type2 int = 0
DECLARE order_cursor CURSOR FOR
SELECT customer, orders, [type]
FROM #orders
循环你的 table:
OPEN order_cursor
FETCH NEXT FROM order_cursor INTO @Customer, @Order, @Type
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #res
VALUES(@Customer, @Order, @Type, @nr_type1, @nr_type2)
IF @Type = 1
SET @nr_type1 = @nr_type1 + 1
ELSE
SET @nr_type2 = @nr_type2 + 1
FETCH NEXT FROM order_cursor INTO @Customer, @Order, @Type
END
打印结果:
SELECT * FROM #res
使用后关闭游标:
CLOSE order_cursor
DEALLOCATE order_cursor
GO
如果您不再需要,请删除您的结果 table:
DROP TABLE #res
我相信 HANA 支持 windowed aggregates。以下脚本在 SQL 服务器上进行了测试,但我相信相同的查询应该适用于 HANA:
declare @t table(customer varchar(20) not null, orders varchar(10) not null, Type int not null)
insert into @t(customer,orders,Type) values
('customerA','Order1',1),
('customerA','Order2',1),
('CustomerA','Order3',2),
('customerA','Order1',1),
('customerA','Order2',2),
('customerA','Order3',2),
('CustomerA','Order1',1),
('customerA','Order2',2)
select
*,
SUM(CASE WHEN Type=1 THEN 1 ELSE 0 END) OVER
(PARTITION BY customer
ORDER BY orders
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -
CASE WHEN Type=1 THEN 1 ELSE 0 END as TotalType1,
SUM(CASE WHEN Type=2 THEN 1 ELSE 0 END) OVER
(PARTITION BY customer
ORDER BY orders
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -
CASE WHEN Type=2 THEN 1 ELSE 0 END as TotalType1
from @t
结果:
customer orders Type TotalType1 TotalType1
-------------------- ---------- ----------- ----------- -----------
customerA Order1 1 0 0
customerA Order1 1 1 0
CustomerA Order1 1 2 0
customerA Order2 2 3 0
customerA Order2 2 3 1
customerA Order2 1 3 2
CustomerA Order3 2 4 2
customerA Order3 2 4 3
希望 windows 的定义相当容易区分 - 没有人指责 SQL 过于简洁。
(我没有得到问题中要求的确切结果,但那是因为示例数据集不包含足够的列来放置在 ORDER BY
子句中,这样 "before"定义明确。我目前正在使用 orders
但这不是唯一的)
一个客户有订单,每个订单都是类型 1 或类型 2。我想计算每种类型在每个订单之前 出现的次数。
例如一位客户:
customer | orders| Type
---------+-------------
customerA| Order1| 1
customerA| Order2| 1
CustomerA| Order3| 2
customerA| Order1| 1
customerA| Order2| 2
customerA| Order3| 2
CustomerA| Order1| 1
customerA| Order2| 2
所需结果:
customer | orders| Type| Nr_typ1| Nr_typ2
---------+-------+-----+--------+-------
customerA| Order1| 1 | 0 | 0
customerA| Order2| 1 | 1 | 0
CustomerA| Order3| 2 | 2 | 0
customerA| Order1| 1 | 2 | 1
customerA| Order2| 2 | 3 | 1
customerA| Order3| 2 | 3 | 2
CustomerA| Order1| 1 | 3 | 3
customerA| Order2| 2 | 4 | 3
我尝试的是:
select t.customer, t.orders, t.type, sum(t.type1), sum(t.type2) from
(select customer, orders, type,
case type = 1 then 1 else 0 end as type1,
case type = 2 then 1 else 0 end as type2
from table customer_orders) t group by customer, orders, type
如有任何建议,我们将不胜感激!谢谢
您可以在 SQL 中使用 with WHILE
循环,如下所示。 (#order是我的订单table,你改成你实际的table)
创建 table 以存储结果:
CREATE TABLE #res
(customer varchar(100),
orders varchar(100),
[type] int,
Nr_typ1 int,
Nr_typ2 int)
为WHILE
循环声明一些变量和游标:
DECLARE @Customer varchar(100), @Order varchar(100), @Type int, @nr_type1 int = 0, @nr_type2 int = 0
DECLARE order_cursor CURSOR FOR
SELECT customer, orders, [type]
FROM #orders
循环你的 table:
OPEN order_cursor
FETCH NEXT FROM order_cursor INTO @Customer, @Order, @Type
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #res
VALUES(@Customer, @Order, @Type, @nr_type1, @nr_type2)
IF @Type = 1
SET @nr_type1 = @nr_type1 + 1
ELSE
SET @nr_type2 = @nr_type2 + 1
FETCH NEXT FROM order_cursor INTO @Customer, @Order, @Type
END
打印结果:
SELECT * FROM #res
使用后关闭游标:
CLOSE order_cursor
DEALLOCATE order_cursor
GO
如果您不再需要,请删除您的结果 table:
DROP TABLE #res
我相信 HANA 支持 windowed aggregates。以下脚本在 SQL 服务器上进行了测试,但我相信相同的查询应该适用于 HANA:
declare @t table(customer varchar(20) not null, orders varchar(10) not null, Type int not null)
insert into @t(customer,orders,Type) values
('customerA','Order1',1),
('customerA','Order2',1),
('CustomerA','Order3',2),
('customerA','Order1',1),
('customerA','Order2',2),
('customerA','Order3',2),
('CustomerA','Order1',1),
('customerA','Order2',2)
select
*,
SUM(CASE WHEN Type=1 THEN 1 ELSE 0 END) OVER
(PARTITION BY customer
ORDER BY orders
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -
CASE WHEN Type=1 THEN 1 ELSE 0 END as TotalType1,
SUM(CASE WHEN Type=2 THEN 1 ELSE 0 END) OVER
(PARTITION BY customer
ORDER BY orders
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -
CASE WHEN Type=2 THEN 1 ELSE 0 END as TotalType1
from @t
结果:
customer orders Type TotalType1 TotalType1
-------------------- ---------- ----------- ----------- -----------
customerA Order1 1 0 0
customerA Order1 1 1 0
CustomerA Order1 1 2 0
customerA Order2 2 3 0
customerA Order2 2 3 1
customerA Order2 1 3 2
CustomerA Order3 2 4 2
customerA Order3 2 4 3
希望 windows 的定义相当容易区分 - 没有人指责 SQL 过于简洁。
(我没有得到问题中要求的确切结果,但那是因为示例数据集不包含足够的列来放置在 ORDER BY
子句中,这样 "before"定义明确。我目前正在使用 orders
但这不是唯一的)