我在PostgreSQL中有两个表。我想这可能是由于我的PK / FK问题,或者我对如何正确查询缺乏了解:
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
以及一些其他名称和数据,包含数月。
我在Minute中的数据类型如下:
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 :(得分:2)
除了Day
之外,您似乎忘了加入Name
。
在连接条件中,而不是:
ON (minute.name = dataman.name)
这应该是:
ON (minute.name = dataman.name AND minute.Day=dataman.Day)
由于dataman
中的(姓名,日期)存在唯一约束,因此我们知道dataman
中只有一行符合minute
中的每一行,并具有上述连接条件
答案 1 :(得分:0)
如果我理解正确,您需要在dataman
表格中的日期之前或之后的最新大小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