如何在SQL中选择一个连续的日期

时间:2019-03-19 13:27:09

标签: mysql sql

这是我要处理的数据

create table weather(
    id int,
    recorddate date,
    temp int,
    primary key (id)
);

insert into weather values (1, '2015-01-01', 10);
insert into weather values (2, '2015-01-02', 15);
insert into weather values (3, '2015-01-03', 20);

我想选择一个温度比前一天更高的日期,并且我使用了以下查询:

select id
from weather a
where id = (select id from weather b where datediff(a.recorddate, b.recorddate) = -1 and b.temp > a.temp)

查询返回0条记录,我知道子查询的逻辑是正确的,但是由于某种原因它不起作用。

更新

我不是在寻找写此查询的替代方法,我想知道上面的查询出了什么问题?

更新

我弄错的部分是我正在考虑通过编写where id=...

assign

6 个答案:

答案 0 :(得分:1)

  

我不明白为什么我的写作方式不起作用

因为您正在比较a.id = b.id,但是您的条件保证了它们永远不会相等。

这是一个演示,它显示了您可能要匹配的行,因为它们具有datediff = -1和b.temp> a.temp,但是在两种情况下,id都不相同。

mysql> select a.id as a_id, b.id as b_id, 
  datediff(a.recorddate, b.recorddate) as datediff, 
  b.temp > a.temp, a.id = b.id 
from weather a cross join weather b;
+------+------+----------+-----------------+-------------+
| a_id | b_id | datediff | b.temp > a.temp | a.id = b.id |
+------+------+----------+-----------------+-------------+
|    1 |    1 |        0 |               0 |           1 |
|    2 |    1 |        1 |               0 |           0 |
|    3 |    1 |        2 |               0 |           0 |
|    1 |    2 |       -1 |               1 |           0 | <--
|    2 |    2 |        0 |               0 |           1 |
|    3 |    2 |        1 |               0 |           0 |
|    1 |    3 |       -2 |               1 |           0 |
|    2 |    3 |       -1 |               1 |           0 | <--
|    3 |    3 |        0 |               0 |           1 |
+------+------+----------+-----------------+-------------+

a.id = b.id的唯一方法是,如果您要比较完全相同的行(id是主键,因此只有一行可以具有该值),但是在这种情况下,datediff自然是0,并且两个温度都不会大于另一个温度-它们将相等,因为它是同一行。

答案 1 :(得分:1)

我建议您使用LAG函数,使用它可以获取前一天的温度,然后只需添加一个where子句,将行的实际温度与LAG函数的结果进行比较。这是一个很好的用法示例:http://www.mysqltutorial.org/mysql-window-functions/mysql-lag-function/。 例如:

SELECT id
FROM (
SELECT id, temp, LAG(temp,1) OVER (ORDER BY recorddate ASC) AS prev_temp, 
LAG(recorddate,1) OVER (ORDER BY recorddate ASC) AS prev_recorddate
FROM weather
)
WHERE prev_temp < temp
AND datediff(recorddate, prev_recorddate) = -1

请记住,此功能在MySQL 8.0之前受支持,但您可以如本文Simulate lag function in MySQL

所示对其进行仿真

答案 2 :(得分:0)

您的查询返回零行,因为WHERE条件始终为false

让我们重写如下:

where a.id = (select b.id from weather b where datediff(a.recorddate, b.recorddate) = -1 and b.temp > a.temp)

您要求a.idb.id相同,但同时datediff(a.recorddate, b.recorddate) = -1 and b.temp > a.temp显然是不可能的。

答案 3 :(得分:0)

我看到该问题已更新(或者我在阅读时错过了该部分),所以这是我的最新答案:

您的查询尝试查找具有相同ID但日期和温度值不同的两行,鉴于ID是唯一的,因此这当然是不可能的。 id不能简单地成为“等于”条件的一部分。


旧答案以及可能的解决方法。

使用基于温度比较的简单连接,DATEDIFF是两行之间的连接

SELECT *
FROM weather w
JOIN weather w2 ON w.temp > w2.temp AND DATEDIFF( w.recorddate, w2.recorddate) = 1

答案 4 :(得分:0)

使用它:对我有用

Select recorddate from weather where temp>
(Select temp from weather where id =
(Select max(id) from weather)-1)

答案 5 :(得分:-1)

您需要通过将具有该日期的同一张表联接在一起来首先获取前一个日期的记录,然后应用临时条件:

select w.recorddate from weather w
join weather w2 on ( w.recorddate = DATE_ADD( w2.recorddate, INTERVAL 1 DAY ) )
where w.temp > w2.temp;