每个订单之前某种类型的订单数量

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 但这不是唯一的)