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

时间:2014-03-31 17:32:14

标签: sql sql-server select join

我正在尝试连接两个表,但只显示唯一的行和最新的日期。

在线查看我发现了在单个表中实现或连接两个表或选择唯一行(和最新日期)的各种方法。我如何将这两者结合起来?

加入两个表:

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应该是第一个查询的结果,或者在joiing两个表之前得到最新的日期行)但是不知道如何申请它在实践中。

修改
我想做什么:
加入两个表,选择所有列(不包含具有不明确名称的列或分配唯一别名)。在这个新创建的连接表上,我想显示所有唯一的行(基于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;

请注意,除非删除列idMaxDate以外的select语句中的所有列,否则此错误会一直存在。这似乎是有道理的,因为我不能分组任何其他列。此外,先前的查询(和相应的问题)仅尝试查找最大日期并将其添加到另一个表中的等效行。因此我要求另一种方法,因为我认为这不会对数据集起作用。

谢谢,

1 个答案:

答案 0 :(得分:0)

您应该加入上面的“加入表”所需的数据。然后,您可以使用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;