【问题标题】:SQL Server : get latest date from 2 tablesSQL Server:从 2 个表中获取最新日期
【发布时间】:2015-08-17 19:51:46
【问题描述】:

我有两个表 P 和 G,想要编写一个查询,该查询将从表 G 中获取最新日期,并且不会提取重复的客户端 ID:

表P

表 G

我想从查询中得到这个结果:

到目前为止,我已经加入了表格,但无法获得预期的结果。

任何帮助将不胜感激。

【问题讨论】:

  • 你的 JOIN 是什么样的?
  • G_ID 是否与 P_ID 相关,还是巧合?为什么 2012 年 7 月 15 日的行有 INFO = Y?

标签: sql sql-server-2008 join


【解决方案1】:

除了ClientID 列之外,不确定您的表是如何相关的,但您希望在这些列上连接两个表:

select p.clientid,
       max(g.created_on) latest_created_on,
       max(p.info) as info
from tableP p
left join tableG g on p.ClientID = g.ClientID
group by p.clientid;

SQL Fiddle Demo

【讨论】:

    【解决方案2】:

    您可以使用 OVER PARTITION 来获取每个 ClientID 的最近日期的记录。

    在这种情况下,我会写:

    SELECT g.ClientID,
        g.created_on,
        g.INFO
    FROM (
        SELECT ClientID
            created_on,
            INFO,
            row_number() OVER ( PARTITION BY ClientID ORDER BY created_on DESC) AS RowNum
        FROM Table_G
        ) AS g
    WHERE g.RowNum = 1
    

    子查询创建一个包含所有您想要的列的表,并且 row_number() 函数为每条记录分配一个 row_number。 PARTITION BY 表示分组依据,ORDER BY 表示如何在该分区内排序。

    在这种情况下,您需要每个 ClientID 具有最近日期的记录。我们按 ClientID 分组,按日期排序以分配行号,然后在主查询中,我们只选择每个组中的第一行,使用 WHERE g.RowNum = 1

    This is a guide for PostreSQL, but it's helped me understand OVER PARTITION.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多