加入两个表,只显示唯一值和最大日期
Posted
技术标签:
【中文标题】加入两个表,只显示唯一值和最大日期【英文标题】:Join two tables, only display unique values and maxium date 【发布时间】:2014-03-31 17:32:13 【问题描述】:我正在尝试连接两个表,但只显示唯一行和最新日期。
在网上我发现了各种方法来实现或连接两个表,或在单个表中选择唯一行(和最新日期)。我将如何将这两者结合起来?
连接两个表:
select *
from Table01 AS s
left join Table02 AS p on s.id = p.id
在单个表中获取唯一行和最新日期:
select * from (
select id_01, id_02, max(dt_date) AS MaxDt
from Table01
group by id_01, id_02) TempTable
join Table01 ComTable on
TempTable.id_01 = ComTable.id_01 and
TempTable.id_02 = ComTable.id_02 and
TempTable.MaxDt = ComTable.dt_date
order by ComTable.dt_date desc;
我想我理论上知道该怎么做(第二个查询中的Table01
应该是第一个查询的结果,或者在加入两个表之前获取最新的日期行)但不知道如何应用它练习。
编辑: 我想做什么: 连接两个表,选择所有列(名称不明确的列将不包括在内或分配唯一别名)。在这个新创建的连接表上,我想显示所有具有最新日期的唯一行(基于 id)。 (或者选择最新的唯一行,然后连接两个表)。
示例数据:
Table01
ID column01 column02 column0X
10 test test123 testABC
Table02
ID columnA columnB columnY dt_date
10 data01 data02 data03 01/01/2012
10 data11 data12 data13 02/02/2012
10 data21 data22 data23 03/03/2012
10 data31 data32 data33 04/04/2012
Joined Table
ID column01 column02 column0X columnA columnB columnY dt_date
10 test test123 testABC data01 data02 data03 01/01/2012
10 test test123 testABC data11 data12 data13 02/02/2012
10 test test123 testABC data21 data22 data23 03/03/2012
10 test test123 testABC data31 data32 data33 04/04/2012
Actual Output
ID column01 column02 column0X columnA columnB columnY dt_date
10 test test123 testABC data31 data32 data33 04/04/2012
关于链接解决方案的问题:
使用this 会导致以下错误:The column 'xyz' was specified multiple times for 'Table01'.
删除所有重复列(或使用唯一别名),会导致以下错误:Column 'xyz' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
(其中“xyz”可以是多个不同的列。)
SELECT
p.*, d.*
FROM Table01 p
left join
( SELECT
alotofcolumnshere,MAX(dt_date) MaxDate
FROM Table02 s
GROUP BY s.id
) d ON p.id = d.id
ORDER BY d.maxdate DESC;
请注意,此错误一直存在,直到我删除了 select 语句中除列 id
和 MaxDate
之外的所有列。这似乎是有道理的,因为我无法在任何其他列上分组。此外,上一个查询(和相应的问题)仅尝试查找最大日期并将其添加到另一个表中的等效行中。因此我要求另一种方法,因为我认为这不适用于数据集。
谢谢,
【问题讨论】:
列 'xyz' 被多次指定为 'Table' - 为此使用 google。无论如何,这意味着您要加入的表列表中的两列具有相同的名称。如果需要,请使用别名。 当您收到底部错误时,您是否使用了SELECT *
?尝试列出您想要的字段。
您为什么不简单地将您的查询和预期输出放在这里,方便我们使用?
错误可能来自子查询(选择 * 是最可能的原因,正如 Daniel E. 所说)。但是,您在这里没有任何别名为“表格”的东西,所以您能否向我们展示错误的真实陈述?
谢谢,我应该更清楚一点。请查看更新后的帖子。
【参考方案1】:
您应该加入获得上述“已加入表”所需的数据。然后,您可以使用带有 MAXDate 的附加子选择过滤掉那些不再需要的行。将此返回“联接表”的联接需要按 ID 和日期进行,以确保您只获得所需的数据!希望这会有所帮助:
SELECT p.*, p1.*
FROM Table01 p
INNER JOIN Table02 p1 ON p.Id = p1.Id
INNER JOIN
( SELECT s.id, MAX(dt_date) MaxDate
FROM Table02 s
GROUP BY s.id
) d
ON p1.id = d.id AND p1.MaxDate = d.MaxDate
ORDER BY d.maxdate DESC;
【讨论】:
以上是关于加入两个表,只显示唯一值和最大日期的主要内容,如果未能解决你的问题,请参考以下文章