我试图找到以前的页面访问一个人从网页表.我正在使用滞后函数来查找该人访问的前一页,只有当有一个下一页访问.

网页表:

id visit_time webpage_visited
1 2024-03-14 10:00:01 google.com
1 2024-03-14 10:00:07
1 2024-03-14 10:01:15
1 2024-03-14 10:01:10 espn.com
1 2024-03-14 10:02:01

当我使用下面的SQL时,返回的值不考虑行之间的空值/空白值.

SQL used:

select id, 
visit_time, 
webpage_visited, 
coalesce(lag(webpage_visited, 1) over (partition by id order by visit_time  asc), 'none') as previous_webpage_visited
from web

请告诉我如何才能达到下面的预期yields .

Expected output:

id visit_time webpage_visited previous_webpage_visited
1 2024-03-14 10:00:01 google.com None
1 2024-03-14 10:00:07
1 2024-03-14 10:01:15
1 2024-03-14 10:01:10 espn.com google.com
1 2024-03-14 10:02:01

推荐答案

诀窍由两部分组成--使用IGNORE NULLS for your window function并仅在当前值不为空时应用窗口函数:

sample data
WITH dataset(id, visit_time, webpage_visited) AS (
   values (1,'2024-03-14 10:00:01','google.com'),
        (1,'2024-03-14 10:00:07',NULL),
        (1,'2024-03-14 10:01:15',NULL),
        (1,'2024-03-14 10:01:10','espn.com'),
        (1,'2024-03-14 10:02:01',NULL)
)

-- query
select id,
       visit_time,
       webpage_visited,
       if(webpage_visited is not null,
           coalesce(lag(webpage_visited, 1) IGNORE NULLS over(partition by id order by visit_time), 'none'))
           as previous_webpage_visited
from dataset
order by visit_time;

输出:

id visit_time webpage_visited previous_webpage_visited
1 2024-03-14 10:00:01 google.com none
1 2024-03-14 10:00:07 NULL NULL
1 2024-03-14 10:01:10 espn.com google.com
1 2024-03-14 10:01:15 NULL NULL
1 2024-03-14 10:02:01 NULL NULL

UPD

要处理空/空白条目,您可以对其进行预处理,例如使用子查询:

select id,
       visit_time,
       webpage_visited,
       if(webpage_visited_sanitized is not null,
           coalesce(lag(webpage_visited_sanitized, 1) IGNORE NULLS over(partition by id order by visit_time), 'none'))
           as previous_webpage_visited
from (select *,
             if(trim(webpage_visited) = '', null, webpage_visited) webpage_visited_sanitized
      from dataset
     );

Sql相关问答推荐

如何在PostgreSQL中同时为id s列表执行多个update语句?'

对于表A中的每一行,更新表B中与金额有关的行

SQL使最终结果显示两个表后的所有数据(匹配和不匹配)?

为什么在这种情况下我不能使用LAG函数?

SQL SELECT MOST NEST TIMESTAMP BEAT ORDER

带日期函数的复合索引不允许只扫描索引吗?

如何在SQL中从多个查询进行分组

在UNION查询中查找MIN

TSQL如何为群分配号码

在Power Bi中将SQL代码转换为DAX

向表中添加新列取决于表的日期列(unpivot)

SQL Server 查询 WHERE LIKE

如何使用最后一个非 NULL 值在 PostgreSQL 列中填充 NULL 值

SQL 搜索 - 获取最大值日期的奇怪行为

复制行并根据 Oracle SQL 中其他表的值更改值

Postgres如何在一个日历周中前进和回填值

为重复的项目编号显示正在处理

连接表时避免重复

交叉应用 OPENJSON / PIVOT - 错误的顺序

将单行中的多个行值转换为列