加入两个表,只显示唯一值和最大日期

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 语句中除列 idMaxDate 之外的所有列。这似乎是有道理的,因为我无法在任何其他列上分组。此外,上一个查询(和相应的问题)仅尝试查找最大日期并将其添加到另一个表中的等效行中。因此我要求另一种方法,因为我认为这不适用于数据集。

谢谢,

【问题讨论】:

列 '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;

【讨论】:

以上是关于加入两个表,只显示唯一值和最大日期的主要内容,如果未能解决你的问题,请参考以下文章

基于最大日期 <= 给定日期加入

Pandas加入(合并?)数据帧,只保留唯一的指标

加入两个表后 Hive 时间戳值更改

无法获得加入两个表的唯一值

加入两个表日期并获取每个项目的最新日期[关闭]

加入两个表来生成图形,但它们没有公共列