SQL - 根据另一列中的日期过滤一列的结果
Posted
技术标签:
【中文标题】SQL - 根据另一列中的日期过滤一列的结果【英文标题】:SQL - Filter results for 1 column based on date in another column 【发布时间】:2017-03-17 10:51:34 【问题描述】:我很难想出一个合适的标题。这就是问题所在。我正在尝试逐月确定新用户,按他们何时使用该工具并制定计划。
这是我目前所拥有的
select
distinct userID,
MIN(planID),
MIN(PlanCreated)
from dataBaseName.tableName
Group by userID
这为我提供了所需的地面信息。我得到了用户和他们创建的第一个计划以及时间。
但是我需要进一步完善这一点。因为一些用户进入该工具并仅创建计划,使其处于“草稿”状态并且永远不会返回。我需要过滤掉超过 3 个月的草稿计划。
有一个“PlanStatus”列,根据“草稿”状态进行过滤很简单
where PlanStatus
is not in 'Draft'
但同样,我只想从结果中删除那些超过 3 个月的计划。
例如。日期格式 - 2017-01-01 00:00:00
我也不确定是否应该先完成此过滤器,以便在他们后来创建计划并将其移出草稿状态时不会完全删除 ID。
样本数据:
planID | userID | PlanCreated | PlanStatus | OtherColumns
1111 | 2 | 2016-01-17 00:00:00 | Completed | null
1112 | 1 | 2016-06-31 00:00:00 | Draft | null
1113 | 2 | 2017-01-24 00:00:00 | Completed | null
1114 | 3 | 2017-02-04 00:00:00 | Draft | null
1115 | 1 | 2017-03-12 00:00:00 | Draft | null
预期结果:
planID | userID | PlanCreated | PlanStatus | OtherColumns
1111 | 2 | 2016-01-17 00:00:00 | Completed | null
1114 | 3 | 2017-02-04 00:00:00 | Draft | null
1115 | 1 | 2017-03-12 00:00:00 | Draft | null
请帮忙
【问题讨论】:
用您正在使用的数据库标记您的问题。样本数据和期望的结果也会有所帮助。 添加的示例数据以及所需的结果和标记的数据库 注意,如果 PlanId 没有按顺序增加,使用MIN(planID), MIN(PlanCreated)
时可能会得到错误的结果。您真的要返回所有列还是只返回那三列?
【参考方案1】:
首先,您在哪里学会使用 select distinct
和聚合函数。正确的语法是:
select userID, min(planID), min(PlanCreated)
from dataBaseName.tableName
Group by userID;
不需要distinct
。然后你想要一个where
。这是一种方法:
select userID, min(planID), min(PlanCreated)
from dataBaseName.tableName
where not (status = 'draft' and plandate < '2017-01-01')
Group by userID;
请注意,日期函数和常量可能因数据库而异。
【讨论】:
同事推荐使用 distinct。过去两周我一直在学习,今天碰壁了。这似乎正是我需要的。接下来是弄清楚如何使用今天的日期 - 3 个月,而不是硬编码日期。 @Zardoz 。 . ..ADD_MONTHS(CURRENT_DATE, -3)
@Zardoz 。 . .您是否有理由不接受此答案?【参考方案2】:
试试这个:
SELECT userID, MIN(planID) , MIN(PlanCreated) FROM dataBaseName.tableName
WHERE NOT (status = 'draft' AND DATEDIFF(DAY, plancreated, getDate()) > 90)
GROUP BY userID
【讨论】:
不幸的是,在输入where not (PlanStatus = 'Draft' and DATEDIFF(DAY, PlanCreated, getDate())>90)
后,我收到以下错误Syntax error: expected something between '(' and the 'DAY' keyword.
我不知道您的数据使用什么,但我认为不支持“DateDiff”。以上是关于SQL - 根据另一列中的日期过滤一列的结果的主要内容,如果未能解决你的问题,请参考以下文章