【问题标题】:Add FROM and TO columns in mysql table在 mysql 表中添加 FROM 和 TO 列
【发布时间】:2022-01-28 11:27:37
【问题描述】:

我有一个mysql表集群:

Date       user   Cluster 
01/01/21    1      A
01/01/21    2      B
01/01/21    3      C 
02/01/21    1      A
02/01/21    2      A
02/01/21    3      B

我想分析每个日期用户向某些集群的迁移,所需的输出是:

Date        user  From  To 
01/01/21     1     A    A
01/01/21     2     B    B
01/01/21     3     C    C
02/01/21     1     A    A
02/01/21     2     B    A
02/01/21     3     C    B

我试过了,但我不知道如何获取上一个日期的集群(到列)

SELECT date  , user, cluster as from , (
select Cluster   where date  =  date -1 )
FROM Cluster 
group by date , cluster 

【问题讨论】:

  • 日期真的是公布的形式吗?
  • 这两个日期是固定的吗?总是两个日期吗?每个用户总是两个条目吗?
  • 'dont attention to date' - 必须有办法找到以前的记录……你用的是什么版本的 mysql?
  • 我每天修改问题
  • 使用旧的、不受支持的软件版本通常是个坏主意。使用 MySQL 时,是否使用 MySQL 8 或旧版本会有很大的不同,因为添加了重要的特性(即 CTE 和分析/窗口函数)。

标签: mysql sql


【解决方案1】:

您希望显示当天所有用户的集群以及他们前一天的集群。在标准 SQL 和 MySQL 8 中,这只是:

select
  date, 
  user,
  lag(cluster) over (partition by user order by date) as "from",
  cluster as "to"
from cluster
order by date, user;

在旧的 MySQL 版本中,这通常会变得更加复杂。但是,如果都是关于相邻日期,我们可以简单地加入:

select curr.date, user, prev.cluster as "from", curr.cluster as "to"
from cluster curr
join cluster prev on prev.user = curr.user
                 and prev.date = curr.date - interval 1 day
order by curr.date, curr.user;

您的原始查询似乎试图做类似的事情,但您对语法有点困惑:-)

如果日期不相邻,您必须按日期对用户行进行编号。由于 MySQL 8 之前的版本不支持 CTE(WITH 子句),因此您必须多次执行此操作。

你也可以顺便简单展示一下簇链:

select
  user,
  group_concat(cluster order by date separator ' -> ') as clusters
from cluster
order by user;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2022-12-02
    相关资源
    最近更新 更多