mysql 根据日期差异设置状态

wztqucjr  于 2023-04-19  发布在  Mysql
关注(0)|答案(2)|浏览(122)

这是我的输入表(球员表)与playerID和他们的播放日期,我希望这是对里程碑表,其中有球员实现他的里程碑时,我想检查对球员表的里程碑表,看看他们在60天内发挥里程碑日期的细节检查

  • 如果他们没有玩他们是一个60天的搅动者,但如果他们在60天后返回,那么他们的状态是返回者。
  • 如果他们根本没有回来,那么他们是一个60天的搅拌机
  • 如果他们在里程碑日期后的60天内参加比赛,那么他们就是活跃球员

玩家表
| 玩家ID|播放日期|
| --------------|--------------|
| 1|2022年10月1日|
| 1|2022年1月11日|
| 1|2022年1月12日|
| 1|2022年1月13日|
| 1|2022年5月13日|
| 1|2022年5月14日|
| 1|2022年5月15日|
| 二|2022年1月15日|
| 二|2022年2月15日|
| 三|2022年10月15日星期一|
| 四|2022年1月5日|
| 四|2022年5月5日|
里程碑表
| 玩家ID|里程碑|
| --------------|--------------|
| 1|2022年1月13日|
| 二|2022年2月15日|
| 三|2022年10月15日星期一|
| 四|2022年1月5日|
我的输出
| 玩家ID|里程碑日期|流失状态|玩家状态|
| --------------|--------------|--------------|--------------|
| 1|2022年1月13日|60天搅拌机|返回者|
| 二|2022年2月15日|60天搅拌机|丘尔纳|
| 三|2022年10月15日星期一|60天搅拌机|丘尔纳|
| 四|2022年1月5日|活跃玩家|返回者|
如何才能实现这一点

kzipqqlq

kzipqqlq1#

听起来你只对基于里程碑日期 * 之后的球员行(表的奇怪名称,因为它似乎代表比赛,而不是球员)进行分类感兴趣。
这是非常简单的(未经测试):

select m.player_id, m.milestone_date,
    case
        when min(p.date_played) <= m.milestone_date + interval 60 day then 'Active player'
        else '60 day churner'
    end churn_status,
    case
        when min(p.date_played) is not null then 'returner'
        else 'churner'
    end player_status
from milestone m
left join player p on p.player_id=m.player_id and p.date_played > m.milestone_date
group by m.player_id

这将查找每个玩家在里程碑日期之后的玩家行的最小游戏日期(如果有的话),并使用它来确定状态。

w3nuxt5m

w3nuxt5m2#

使用左连接来匹配60天内和60天后的战术。

SELECT m.player_id, m.milestone_date, 
    IF(MAX(c.player_id IS NULL), '60 day churner', 'Active player') AS churn_status, 
    IF(MAX(r.player_id IS NULL), 'churner', 'returner') AS player_status
FROM milestone AS m
LEFT JOIN player AS c ON c.player_id = m.player_id AND c.date_played > m.milestone_date AND c.date_played <= DATE_ADD(m.milestone_date, INTERVAL 60 DAY)
LEFT JOIN player AS r ON c.player_id = m.player_id AND c.date_played > DATE_ADD(m.milestone_date, INTERVAL 60 DAY)
GROUP BY m.player_id

这与player连接了两次。第一次连接获取了里程碑日期和60天后的所有行。第二次连接获取了60天后的所有行。
如果两个日期关系都不匹配,则该连接将返回一行,其中player中的所有列都是NULLIF()条件测试每个连接是否包含这些空值,并在该列中生成相应的结果。

相关问题