Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql--连接时重复值的问题_Sql_Postgresql - Fatal编程技术网

sql--连接时重复值的问题

sql--连接时重复值的问题,sql,postgresql,Sql,Postgresql,我在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 Data

我在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
还有一大堆其他的名字和月份数据

我在分钟内得到的数据类型如下:

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的每个值都放在分钟时间框架上,这是没有意义的。

如果我理解正确,您需要
Dataman
表中日期之前或当天的最新大小。这个解释正确吗

下面是使用相关子查询获取它的一种方法:

 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 

除了
Name
之外,您似乎还忘了在
日加入

在联接条件中,而不是:

ON (minute.name = dataman.name)
这应该是:

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

由于
dataman
中对(名称、日期)有一个唯一的约束,我们知道
dataman
中只有一行符合
minute
中的每一行,并且符合上述连接条件。

就我而言,问题是连接将只匹配特定的日期,因为minute.day(每天)具有比数据员更高的天数粒度(每月一天)。我希望它能让博士后留下最后一个已知的值。因此,在dataman更改之前,整个月都会重新绘制值。