sql 窗口化以在给定条件下保留记录

标签 sql windowing

我在一个网站上有一些数据,该网站有不同的商店部分,但是当用户最后结账时,我们只能通过查找他们最近点击的部分来知道它是哪个商店部分

例如,如果我的数据看起来像

session, hit_number, page
a,1,homepage
a,2,generic_page
a,3,shoe_store,
a,4,buy_add_basket
a,5,buy_checkout
b,1,sock_store
b,2,shoe_store,
b,3,buy_add_to_basket
b,4,buy_checkout
c,1,homepage
c,2,sock_store
c,3,sock_store
c,4,buy_add_to_basket
c,5,home_page
c,6,shoe_store
a,5,home_page


我想保留他们去的最后一家商店(存在的地方并且仅当他们在网页的购买部分时(即页面名称以“购买”开头)

我期待的输出是:

session, hit_number, page
a,1,homepage,null
a,2,generic_page,null
a,3,shoe_store,null
a,4,buy_add_basket,shoe_store
a,5,buy_checkout,shoe_store
b,1,sock_store,null
b,2,shoe_store,null
b,3,buy_add_to_basket,shoe_store
b,4,buy_checkout,shoe_store
c,1,homepage,null
c,2,sock_store,null
c,3,sock_store,null
c,4,buy_add_to_basket,sock_store,
c,5,home_page,null
c,6,shoe_store,null
a,5,home_page,null

最佳答案

我在 SQL Server 中执行了此操作,但是获取结果的查询在大多数供应商中都可以使用。它背后的逻辑是检查何时 page列包含 'buy'然后得到min值,即上面页面名称包含 'store' 的值

创建并填充表:

DECLARE @table TABLE
(
    session    VARCHAR(1),
    hit_number INT,
    page       VARCHAR(50)
);
INSERT INTO @table VALUES 
('a',1,'homepage'),
('a',2,'generic_page'),
('a',3,'shoe_store'),
('a',4,'buy_add_basket'),
('a',5,'buy_checkout'),
('b',1,'sock_store'),
('b',2,'shoe_store'),
('b',3,'buy_add_to_basket'),
('b',4,'buy_checkout'),
('c',1,'homepage'),
('c',2,'sock_store'),
('c',3,'sock_store'),
('c',4,'buy_add_to_basket'),
('c',5,'home_page'),
('c',6,'shoe_store'),
('a',5,'home_page');
Select * From @table将给出以下结果:
session hit_number  page
a       1           homepage
a       2           generic_page
a       3           shoe_store
a       4           buy_add_basket
a       5           buy_checkout
b       1           sock_store
b       2           shoe_store
b       3           buy_add_to_basket
b       4           buy_checkout
c       1           homepage
c       2           sock_store
c       3           sock_store
c       4           buy_add_to_basket
c       5           home_page
c       6           shoe_store
a       5           home_page

询问:
SELECT
    session,
    hit_number,
    page,
    CASE
        WHEN page LIKE 'buy%'
        THEN MIN(CASE
                     WHEN page LIKE '%store'
                     THEN page
                     ELSE NULL
                 END) OVER(PARTITION BY session ORDER BY hit_number)
        ELSE NULL
    END AS previous_buy_page
FROM @table;

返回所需的结果:
session hit_number  page                previous_buy_page
a       1           homepage            NULL
a       2           generic_page        NULL
a       3           shoe_store          NULL
a       4           buy_add_basket      shoe_store
a       5           buy_checkout        shoe_store
a       5           home_page           NULL
b       1           sock_store          NULL
b       2           shoe_store          NULL
b       3           buy_add_to_basket   shoe_store
b       4           buy_checkout        shoe_store
c       1           homepage            NULL
c       2           sock_store          NULL
c       3           sock_store          NULL
c       4           buy_add_to_basket   sock_store
c       5           home_page           NULL
c       6           shoe_store          NULL

关于sql 窗口化以在给定条件下保留记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871622/

相关文章:

sql - 无效的对象名称 sql

php - 计算 PHP 中 SQL 表的数量?

python - numpy数组的快速条件重叠窗口(框架)

reactjs - 将 React-Window 添加到 Material-UI 增强表 : type is invalid -- expected a string or a class/function but got: array

linux - X11 - 设置光标位置不起作用

c# - SQL查询获取整数的十六进制值的Int值

MySQL 变量值错误(SELECT INTO)

MySQL 查询选择过去 7 天的每一天的最后一条记录

java - 如何将汉宁函数应用于我的音频样本?

cocoa - 如何制作一个像 Mac OS X Dock 堆栈一样的窗口?