SQL在where语句中使用日期范围的选择子查询来确定该日期范围内的最大值

Posted

技术标签:

【中文标题】SQL在where语句中使用日期范围的选择子查询来确定该日期范围内的最大值【英文标题】:SQL using select subquery for date range in where statement to determine the max value in that date range 【发布时间】:2018-10-25 19:40:51 【问题描述】:

我试图在一个时间范围内获得每个用户的最大值。日期范围由每个用户在单独的时间范围内的第一次出现和前 2 周确定,即用户在 10 月首次出现的时间是 2018-10-01,因此范围是从 2018-09-18至 2018 年 10 月 1 日。在该范围内,我正在寻找一列的最大值。所有这些数据都来自同一张表。

例子:

+------------+------------+---------+
| Profile_ID |    Date    | Value   |
+------------+------------+---------+
|          1 | 2018-10-05 |    100  |
|          2 | 2018-10-02 |     50  |
|          2 | 2018-10-04 |     78  |
|          2 | 2018-10-05 |     56  |
|          1 | 2018-10-08 |    110  |
|          1 | 2018-10-01 |     99  |
|          2 | 2018-09-30 |     88  |
|          1 | 2018-09-27 |    106  |
+------------+------------+---------+

我正在寻找在 OCT 1 之前的两周(包括 OCT 1 之后的第一次出现)的峰值 VALUE。对于用户 1 来说,这将是 2018-10-01,对于用户 2 来说是 2018-10-02。峰值将那么分别是 106 和 88。

我尝试了代码:

SELECT max(Value)
FROM table
WHERE Date BETWEEN (
  SELECT (min(Date) - INTERVAL 2 week)
  FROM table
  WHERE stamp between '2018-10-01' AND '2018-10-25'
  GROUP BY profile_id
  )
  AND
  (
  SELECT min(Date)
  FROM table
  WHERE stamp between '2018-10-01' AND '2018-10-25'
  GROUP BY profile_id
  )

我收到一个错误:

语法错误:在“2”处或附近

但我认为这只是我的问题的开始。有谁知道在该时间范围内为每个 profile_id 找到最大值的最佳方法?

【问题讨论】:

请用您正在使用的数据库标记您的问题。 您使用的是哪个 dbms? (我会尝试INTERVAL '2' week。) 是postgresql吧? 【参考方案1】:

如果我理解正确,您可以使用row_number() 和一些日期过滤:

select t.*
from (select t.*,
             row_number() over (partition by profile_id order by date desc) as seqnum
      from t
      where date <= '2018-10-01'
     ) t
where seqnum = 1;

【讨论】:

以上是关于SQL在where语句中使用日期范围的选择子查询来确定该日期范围内的最大值的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中怎样比较两个日期的大小???

SQL语句获取日期的月份

SQL语句怎样查询一个范围

SQL 如何查询日期在一定范围内的数据

【SQL语句】-范围查询

如何在 Oracle SQL 的 Where 语句中添加大小写