0

我在 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 的每个值都放在分钟时间范围内,这没有意义。

4

2 回答 2

2

看起来你只是忘记加入DayName

在连接条件下,而不是:

ON (minute.name = dataman.name)

这应该是:

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

由于 (name,day) in 有一个唯一约束dataman,我们知道只有一行dataman将匹配 in 中的每一行minute,并具有上述连接条件。

于 2013-07-09T21:44:02.573 回答
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 
于 2013-07-09T21:30:15.553 回答