我有一个包含列名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。
答案 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的语法。