2017-07-30 114 views
0

如何将下列表格结合到此结果中?根据公共列从多个表中选择不同的列

结果应该是idUnit的一行,该行的最新日期与Table2相匹配的那个行的ID。

我设法合并了表格,但不是基于最新的日期。

示例数据:

Table1 
id idUnit Date     extra 
1  1   2017-01-23 01:00:00 a 
2  1   2017-01-23 02:00:00 b 
3  2   2017-01-23 01:00:00 c 
4  2   2017-01-23 02:00:00 d 


Table2 
id date     extra2 
1  2017-01-23 01:00:00 w 
2  2017-01-23 02:00:00 x 
3  2017-01-23 01:00:00 y 
4  2017-01-23 02:00:00 z 


Result 
id idUnit Date     extra extra2 
2  1   2017-01-23 02:00:00 b  x 
4  2   2017-01-23 02:00:00 d  z 
+0

你应该使用显式连接语法,这是因为92 ANSI标准!你可以使用谷歌如何纳入最大日期;这种类型的问题在很多时候都被问过许多次。 – HoneyBadger

回答

0

请使用JOIN现代语法,而不是逗号分隔的表用在哪里。

所以,你的SQL变得

select t1.id, t1.idUnit, MAX(t1.date), t1.?, t2.? from table1 t1 INNER JOIN table2 t2 
ON t1.id = t2.id and t1.date = t2.date 
GROUP BY t1.id, t1.idUnit, t1.?, t2.? 

请注意,您必须在GROUP BY所有你在SELECT希望等领域包括(在那里我有T1?和t2。?作为占位符)

编辑

看过示例数据,请尝试以下操作。如果您使用SQL Server,则可以复制整个事件并粘贴到查询窗口中。可以在任何数据库中完成与以下所用类似的子查询方法。

declare @table1 table 
(
id int, 
idUnit int, 
tDate datetime, 
extraCol varchar(10) 
) 
declare @table2 table 
(
id int, 
tDate datetime, 
extraCol varchar(10) 
) 
INSERT INTO @table1 VALUES(1, 1, '2017-01-23 01:00:00', 'a') 
INSERT INTO @table1 VALUES(2, 1, '2017-01-23 02:00:00', 'b') 
INSERT INTO @table1 VALUES(3, 2, '2017-01-23 01:00:00', 'c') 
INSERT INTO @table1 VALUES(4, 2, '2017-01-23 02:00:00', 'd') 

INSERT INTO @table2 VALUES(1, '2017-01-23 01:00:00', 'w') 
INSERT INTO @table2 VALUES(2, '2017-01-23 02:00:00', 'x') 
INSERT INTO @table2 VALUES(3, '2017-01-23 01:00:00', 'y') 
INSERT INTO @table2 VALUES(4, '2017-01-23 02:00:00', 'z') 

SELECT t1.id, t1.idUnit, t1.tDate, t1.extraCol, t2.extraCol FROM @table1 t1 
INNER JOIN @table2 t2 ON t1.id = t2.id and t1.tDate = t2.tDate 
INNER JOIN 
(SELECT idUnit, MAX(tDate) as maxDate FROM @table1 
GROUP By idUnit) m 
ON t1.idUnit = m.idUnit and t1.tDate = m.maxDate 
ORDER BY id 
+0

这并没有预期的结果,不幸的是。 max(日期)不是每个idUnit的最大日期,每个idUnit超过1行,id和日期的组合应该是唯一的。我认为我可能解释得不好,但经过筛选最大(日期)后,我预计每个idUnit(最新的)留在表1中的1行与表2连接 –

+0

因此,请您给我们一些样本数据和预期结果?这会让生活变得更容易。 –

+0

更新了原始问题 –

0

试试这个。在这里这两个表使用Inner连接进行连接。

SELECT MAX(t1.date) FROM table1 INNER JOIN table2 
ON table2.id = table1.id and table1.date= table2.date; 
0

其实你的问题主要是如何每idUnit得到最大(ID) - 之后的加入仅仅是根据ID列(简单的内部连接) 如果你的数据库支持它的最简单的解决方法是使用窗口函数(分区idUnit按日期排序)

如果您的数据库还不支持它(如MySQL 5.7),那么你可以使用一些嵌套查询来查找每个idUnit的最大日期的行。 (注意它通常要慢得多...)

问候,
强尼

相关问题