Fa06 的答案是(原为;现在已删除)我可能如何正常处理枢轴,但您的情况略有不同,因为您希望保留所有行,并且该答案将仅保留用户的最后一次登录和退出
只要 in 和 out 被可靠地写入,您就可以:
SELECT
userid,
indate,
indir,
case when nextdir ='out' then nextdate end as outdate,
case when nextdir ='out' then nextdir end as outdir
FROM
(
SELECT
userid,
logdate as indate
direction as indir,
lead(logdate) over(partition by userid order by logdate) as nextdate,
lead(direction) over(partition by userid order by logdate) as nextdir
FROM
table
) x
WHERE indir='in'
在内部查询中,我们使用 LEAD 函数为每个用户检索“下一个”行的日期和方向值。“下一个”被定义为“时间戳紧跟在当前行之后的行”。希望对于每一行,这将是相应的输出行,但如果我们按顺序获得两个行,则可能不是。
无论如何,一旦我们将结果集添加到每个 IN 行,其中包含下一个 OUT 值,并且每个输出行都包含下一个 In 值,我们只需通过 WHERE indir = 'in' 删除一半的行。这将删除一半的行,但这没关系,因为我们从这些行中获取了我们想要的数据并将其带入我们使用 LEAD 操作保留的行中
这也是一个很好的机会来检查输出数据是否真的是输出数据,这就是什么时候会发生的情况。如果两行按顺序出现,那么 nextX 列中将包含 IN 数据,而不是输出数据,因此我们通过不提供它们是否包含 IN 数据的任何情况来将其归零
请注意,前面说的是“可靠地编写”,因为如果您有多行具有相同的时间戳,并且数据库选择在输入行之前对输出行进行排序,则此方法可能会变得不稳定。在这种情况下,您可以考虑将方向添加到 order by so in sorts before out。只有您知道这是否必要
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句