sql - 使用左连接选择我们需要列的最旧值的行
问题描述
想象以下场景,我们有两个表。一张表存储我们的玩家及其状态、创建日期和 ID,另一张表保存他们的登录活动。
我想检索所有登录超过N年或从未登录过的玩家。如您所见,我们有一个 id = 4 的玩家从未登录过游戏,所以我们也想将他包括在我们的列表中通过检查他的创作日期。
也可以在活动表中为玩家提供多个条目,因此我们的兴趣是只为该玩家带来具有 [max(LoginDate) < N ] 的行。
我已经有了解决方案,但我渴望看到不同的方法。
PLAYER_TABLE
--------------------------------------
|PlayerId |CreationDate | Status |
--------------------------------------
|1 |01.01.2000 | ACTIVE |
--------------------------------------
|2 |01.01.2019 | ACTIVE |
--------------------------------------
|3 |01.01.2001 | SUSPENDED|
--------------------------------------
|4 |01.01.2004 | ACTIVE |
--------------------------------------
ACTIVITY_TABLE
-----------------------
|AccountId |LoginDate |
-----------------------
|1 |01.01.2005 |
-----------------------
|1 |05.06.2007 |
-----------------------
|2 |03.05.2010 |
-----------------------
|3 |01.01.2018 |
-----------------------
解决方案
使用 CTE(公用表表达式)来实现分析并让我们基于单个日期进行过滤:
WITH CTE AS(
SELECT player.PlayerId
, activity.ddt
, coalesce(max(Activity.Logindate) over (partition by Activity.AccountID), player.CreationDate) as LastLoginOrCreation
FROM PLAYER_TABLE player
LEFT JOIN ACTIVITY_TABLE activity
ON activity.AccountId = player.PlayerId)
SELECT *
FROM CTE
WHERE player.status != 'SUSPENDED'
and LastLoginOrCreation <= to_date('2015-01-01', 'yyyy-MM-dd')
避免 CTE 消除了内联选择,但仍然必须过滤两个日期。
SELECT player.PlayerId
, activity.ddt
, coalesce(max(Activity.Logindate) over (partition by Activity.AccountID), player.CreationDate) as LastLoginOrCreation
FROM PLAYER_TABLE player
LEFT JOIN ACTIVITY_TABLE activity
ON activity.AccountId = player.PlayerId
WHERE (player.CREATION_DATE <= to_date('2015-01-01', 'yyyy-MM-dd')
OR activity.LoginDate <= to_date('2015-01-01', 'yyyy-MM-dd'))
AND player.status != 'SUSPENDED';
推荐阅读
- reactjs - 如何正确使用带有 axios + react 的拦截器
- python - tkinter 官方文档或 github 存储库在哪里?
- node.js - 在 Node.js 中使用 websocket 时如何保持模块化
- pytest - 在 pytest 中,如何针对具有不同标记或名称模式的情况针对不同的 ip 运行
- javascript - 有没有办法在页面加载之后但在脚本执行之前运行内容脚本?
- swift - AudioKit:如何动态改变节奏?
- javascript - 没有这种付款方式 - 克隆付款方式 Stripe Connect
- node.js - 可以 express.static 找到你的挂载文件
- flutter - Flutter - 当默认 mainAxisSize = max 时,Column 如何限制其在 ListView 内的高度?
- typescript - 如何在Angular中停止iframe console.log