如何在SQL中对列进行分组?

纳文库马尔

我有一个表,其中在同一列中输入/输出用户条目。

我想将列方向输入分组为用户输入列,将方向输出分组为用户输出列。

我想要 SQL 查询来执行此操作。

如何使用 SQL 查询做到这一点?

实际表 ![][1]][1]

预期表

凯厄斯·贾德

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章