2012-11-29 89 views
0

我有一個列名稱爲ID,日期和值的表。預計該值每天都會改變。但有些情況下價值保持不變。所以我想要創建一個sql查詢來選擇ID值在3天內沒有變化的地方。我如下圖所示。預先感謝您的幫助。選擇列值不變的記錄

例如當前日期是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。

+5

什麼是你的關係數據庫管理系統,你到目前爲止嘗試過了什麼? –

+0

此外,請告訴我們[您嘗試過的](http://www.whathaveyoutried.com) – Kermit

+0

爲什麼每天都有新的行?爲什麼不在創建新記錄時改變值?如果「當日」記錄丟失會發生什麼?或者如果有差距?如果它回到'三天前'的價值會發生什麼? –

回答

0

如果您要添加包含更改日期的列,該怎麼辦?您可以使用一個條件 WHERE ((GetDate() - dateOfChange)/86400) > 3.

+0

-1:不適用於處理夏令時的任何日期範圍。此外,是(可能,我不確定你指的是哪一個)依賴於特定於RDBMS的行爲,這還沒有被指定。另外,對於示例數據太簡單了。 –

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 [email protected] 

先用相同的ID從昨天參加比賽,如果值是相同的,下一個與前一天。如果您沒有將日期存儲爲日期a)爲什麼不呢?和b)你將需要轉換文本以及。

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的語法。