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())&gt;90) 后,我收到以下错误Syntax error: expected something between '(' and the 'DAY' keyword. 我不知道您的数据使用什么,但我认为不支持“DateDiff”。

以上是关于SQL - 根据另一列中的日期过滤一列的结果的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列中的更改创建带有时间戳的最后修改列

根据另一列的值过滤数据框列[重复]

如何根据Python中另一列中的日期查找最频繁的值

在另一列满足条件后计算一列中的值

如何结合一列的日期和另一列的时间

基于sql中另一列的一列中的最大数据