0

我有一个列名 ID、日期和值的表。该值预计每天都会发生变化。但是,在某些情况下,该值保持不变。所以我想创建一个sql查询来选择值3天没有改变的ID。我将表格说明如下。提前感谢您的帮助。

例如,当前日期是 11 月 29 日。因此查询必须检查过去 3 天的值。

    ID   Date   Value
    B99  28nov  400
    B99  27nov  120
    B99  26nov  120
    B99  25nov  300
    A12  28nov  800
    A12  27nov  800
    A12  26nov  800
    A12  25nov  800
    C45  28nov  100
    C45  27nov  260
    C45  26nov  230
    C45  25nov  230

所以查询应该返回 A12。

4

3 回答 3

0

如果您要添加带有更改日期的列怎么办?您可以使用下一个条件 WHERE ((GetDate() - dateOfChange) / 86400) > 3.

于 2012-11-29T04:00:16.647 回答
0

您没有指定您的 RDBMS,但此解决方案可能可以转换为大多数。我假设null每天都存在非读数:

PostgreSQL 9.1 架构设置

create table foo(id text, changed_on date, val integer);
insert into foo(id, changed_on, val)
values ('B99', to_date('2012-11-28','yyyy-mm-dd'), 400),
       ('B99', to_date('2012-11-27','yyyy-mm-dd'), 120),
       ('B99', to_date('2012-11-26','yyyy-mm-dd'), 120),
       ('B99', to_date('2012-11-25','yyyy-mm-dd'), 300),
       ('A12', to_date('2012-11-28','yyyy-mm-dd'), 800),
       ('A12', to_date('2012-11-27','yyyy-mm-dd'), 800),
       ('A12', to_date('2012-11-26','yyyy-mm-dd'), 800),
       ('A12', to_date('2012-11-25','yyyy-mm-dd'), 800),
       ('B99', to_date('2012-11-28','yyyy-mm-dd'), 100),
       ('B99', to_date('2012-11-27','yyyy-mm-dd'), 260),
       ('B99', to_date('2012-11-26','yyyy-mm-dd'), 230),
       ('B99', to_date('2012-11-25','yyyy-mm-dd'), 230)
;

查询

select id
from foo
where changed_on>=to_date('2012-11-29','yyyy-mm-dd')-3
group by id
having count(distinct val)=1

结果

|  ID |
-------
| A12 |

如果您想尝试或调整另一个 RDBMS 的语法,这里是 SQL Fiddle 。

于 2012-11-29T05:52:57.783 回答
0

怎么样

SELECT t1.ID
FROM   Table t1
       INNER JOIN
       Table t2 ON t1.ID=t2.ID AND t2.Date=DATEADD(day, -1, t1.Date) AND t1.Value=t2.Value
       INNER JOIN
       Table t3 ON t1.ID=t3.ID AND t3.Date=DATEADD(day, -2, t1.Date) AND t1.Value=t3.Value
WHERE  t1.Date=@WhateverDateYouWant

如果值相同,则第一个连接与昨天的相同 ID 匹配,下一个与前一天匹配。如果您不将日期存储为日期 a) 为什么不呢?b)您还需要将文本转换为。

于 2012-11-29T05:27:10.443 回答