选择列值不变的记录

时间:2012-11-29 03:49:39

标签: sql

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

e.g。当前日期是29Nov。因此查询必须检查过去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。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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)您还需要将文本转换为。

答案 2 :(得分: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 |

Here's the SQL Fiddle如果你想玩或调整另一个RDBMS的语法。