按组查询帮助排名

时间:2015-01-23 00:13:13

标签: sql sql-server sql-server-2008

我正在努力解决逻辑如何处理我正在尝试编写的查询,可以使用一些帮助!

背景: 对重复客户购买的产品进行一些分析,以及随着重复购买次数的增加,产品组合是否会发生变化。作为一次交易的一部分,客户可以走进去购买许多不同的东西。就像在杂货店一样,这是一笔交易,在该交易下购买了许多商品。

所以数据看起来像这样:

CustomerEmail   TransactionID    LineNumber   Item     Price   Date
bob@aol.com     100              1            Hammer   10.00   1/1/2014
bob@aol.com     100              2            Nails     1.00   1/1/2014
bob@aol.com     100              3            wrench   12.00   1/1/2014
bob@aol.com     110              1            Saw      15.00   1/10/2014
bob@aol.com     120              1            Wood      5.00   1/11/2014
jane@gmail      200              1            Hammer   10.00   1/5/2014
Jim@gmail       200              2            Nails     1.00   1/5/2014
Jim@gmail       300              1            Screws    3.00   1/6/2014

我希望输出看起来像:

CustomerEmail   Item      Price    TransactionNumber
bob@aol.com     Hammer    10.00    1
bob@aol.com     nails      1.00    1
bob@aol.com     wrench    12.00    1
bob@aol.com     saw       ...      2
bob@aol.com     wood               3
jane@gmail      hammer             1
jim@gmail       nails              1
jim@gmail       screws             2

所以基本上是每个客户订单历史记录中的排名,但按每个交易分组。希望这是有道理的。我基本上希望能够通过购买数字购买产品,以便能够说'客户更有可能在他们的第一笔交易中购买锤子,但在随后的交易中钉钉子。希望这是有道理的。

1 个答案:

答案 0 :(得分:0)

您可以使用DENSE_RANK

CREATE TABLE temp(
    CustomerEmail   VARCHAR(50),
    TransactionID   INT,
    LineNumber      INT,
    Item            VARCHAR(50),
    PRICE           NUMERIC(6,2),
    [Date]          Date
)
INSERT INTO temp VALUES
('bob@aol.com', 100, 1, 'Hammer', 10.00, '1/1/2014'), ('bob@aol.com', 100, 2, 'Nails', 1.00, '1/1/2014'),
('bob@aol.com', 100, 3, 'wrench', 12.00, '1/1/2014'), ('bob@aol.com', 110, 1, 'Saw', 15.00, '1/10/2014'),
('bob@aol.com', 120, 1, 'Wood', 5.00, '1/11/2014'), ('jane@gmail', 200, 1, 'Hammer', 10.00, '1/5/2014'),
('Jim@gmail', 200, 2, 'Nails', 1.00, '1/5/2014'), ('Jim@gmail', 300, 1, 'Screws', 3.00, '1/6/2014');

--SELECT * FROM temp

SELECT
    CustomerEmail,
    Item,
    Price,
    TransactionNumber = DENSE_RANK() OVER(PARTITION BY CustomerEmail ORDER BY Date, TransactionID)
FROM temp

DROP TABLE temp