2013-07-09 37 views
0

我在PostgreSQL中有兩個表。我認爲這可能是由於我的PK/FK的問題,或者我缺乏的是如何正確地查詢理解:sql - 加入重複值問題

CREATE TABLE Minute 
(
Name varchar(20), 
Day date, 
Minute time, 
Weight real 
Speed real 
PRIMARY KEY (Name, Day, Minute) 
) 
--NOTE: This table has everyday, for every minute in a month. 
CREATE TABLE DataMan 
(
Name varchar(20), 
Day date, --NOTE: This is by day 10/31/2013, 11/31/2013 
Size real, 
Volume real, 
NumEv real, 
PRIMARY KEY (Name, Day) 
) 

數據的種類的,我在的DataMan會是這樣:

GOOG | 10/31/2013 | 123 | 456 | 5 
GOOG | 11/31/2013 | 234 | 412 | 5 

以及一些其他的名稱和數據與幾個月。

數據的種類的,我在一分鐘會是這樣:

GOOG | 10/31/2013 | 12:00:00 | 251.312 | 1231.12 
GOOG | 10/31/2013 | 12:01:00 | 124.51 | 1239 

所以,我想創建一個表,其中有:

Minute.Name | Minute.Date | Minute.Time | DataMan.Size 
GOOG | 10/31/2013 | 12:00:00 | 123 
GOOG | 10/31/2013 | 12:01:00 | 123 

這是我的查詢

SELECT minute.name, minute.date, minute.time, dataman.size 
FROM minute LEFT JOIN dataman ON (minute.name = dataman.name) 
ORDER BY minute.name ASC, minute.date ASC, minute.time ASC 

會發生什麼是表輸出確實是這樣的:

GOOG | 10/31/2013 | 12:00:00 | 123 
GOOG | 10/31/2013 | 12:00:00 | 234 

我希望Dataman.size通過分鐘增量保持不變,但它似乎做一個笛卡爾積,並將Dataman.size的每個值放在分鐘時間框架上,這是沒有意義的。

回答

0

如果我理解沒錯,您需要012xx之前或之中minute表中的最新大小。這個解釋是否正確?

這裏是一個相關子查詢得到它的一種方式:

SELECT minute.name, minute.date, minute.time, 
     (select dataman.size 
     from dataman 
     where minute.name = dataman.name and 
       minute.date >= dataman.date 
     limit 1 
     ) as size 
FROM minut 
ORDER BY minute.name ASC, minute.date ASC, minute.time ASC 
2

它看起來像是你忘記了,除了加入對DayName

代替

在連接條件,:

ON (minute.name = dataman.name) 

這應該是:

ON (minute.name = dataman.name AND minute.Day=dataman.Day) 

由於有在dataman(姓名,一天)的唯一約束,我們知道,只有一行的dataman將與minute中的每一行匹配,並具有上述連接條件。

+0

對於我而言,這個問題將是,JOIN將只匹配某些日子,因爲minute.Day(每天)的天更高粒度那麼的DataMan(1一個月)。我會想要它,這樣postgres會留下最後一個已知的值。因此,整個月都會重新設置值,直到數據管理員發生變化。 – TTT