【问题标题】:How to select the most recent data from SQL joining 3 tables?如何从 SQL 连接 3 个表中选择最新的数据?
【发布时间】:2018-02-11 09:18:19
【问题描述】:

我有 3 张桌子。我需要按列 RANKDATA 从(DATA 表)加入(AGENT 表)。 DATA 表中可能有多个条目。我需要根据 DATE 选择最近的,然后获取 CODE_ID 并加入 CODE 表。

这是我的代码。我尝试使用Max(D.DATE),但出现错误。我唯一的问题是,我不知道如何按最近的日期对其进行分组。

select A.ID, A.NAME, C.CODE_NAME, D.DATE
from Agent A
JOIN Data D ON A.RANKDATA = D.RANKDATA
JOIN CODE C ON D.CODE_ID = C.CODE_ID

output

【问题讨论】:

  • 这里的大多数人想要格式化的文本,而不是图像(或者,更糟糕的是,图像的链接。)并且不需要像那样使用大写。
  • 你在用什么rdbms
  • Max(D.DATE) 是一个好的开始。在查询末尾添加GROUP BY the other selected columns
  • 我使用 sql server
  • 我尝试使用 max() 但我收到此错误“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”

标签: sql sql-server join group-by


【解决方案1】:

我不太清楚您的图像应该是什么结果,但是使用group by 执行此操作的替代方法可能是使用row_numberrow_number 基本上会在行上投影一个带有递增整数 (1,2,3,...n) 的列。您可以按照与分组相同的方式对函数进行“分区”。在这种情况下,我将其划分为a.RankData,但这只是对您想要的内容的猜测。 order by 定义行编号的显示顺序。在这种情况下,我按d.[date] 降序对其进行排序,因此每个a.RankData 的最近日期将是数字1。最后,我将所有这些转换为子查询,以便可以将新列放入@987654328 @ 子句,然后略去那些 RID = 1 (即日期是最大日期)。

select *
from (select 
          RID = row_number() over(partition by a.RankData order by d.[date] desc),
          A.ID, 
          A.NAME, 
          C.CODE_NAME, 
          D.DATE
      from Agent A
      inner join [Data] D 
          on A.RANKDATA = D.RANKDATA
      inner join CODE C 
          on D.CODE_ID = C.CODE_ID) a
where a.RID = 1

【讨论】:

    【解决方案2】:

    您可以尝试使用 CROSS APPLY 作为附加选项。

    SELECT A.ID, A.NAME, T.CODE_NAME, T.DATE
    FROM Agent A
    CROSS APPLY
        (SELECT TOP 1 C.CODE_NAME, D.DATE
            FROM
                Data D JOIN CODE C ON D.CODE_ID = C.CODE_ID
                WHERE A.RANKDATA = D.RANKDATA 
                ORDER BY D.DATE DESC) T
    

    图像有助于形象化。但是,如果您需要其他人的时间来帮助您,那么如果您包含一个简单的脚本来创建您的测试数据,那肯定会很有用: 像这样的:

    CREATE TABLE Agent (ID INT, NAME VARCHAR(30) ,RANKDATA INT)
    INSERT INTO Agent
    VALUES (1,'Mark',12), (2,'Joe',13), (3,'Steve',11), (4,'Sam',10)
    
    CREATE TABLE DATA (ID int, RANKDATA int, CODE_ID VARCHAR(2), DATE datetime)
    INSERT INTO DATA
    VALUES (1,12,'01','20170901 2:30'), (2,13,'02','20170901 6:30'), 
            (3,11,'03','20170901 4:30'), (4,10,'02','20170901 1:30'), 
            (5,10,'03','20170901 2:50'), (6,12,'02','20170901 5:30')
    
    CREATE TABLE CODE(ID int, CODE_ID varchar(2), CODE_NAME Varchar(15))
    INSERT INTO CODE
    VALUES (1,'01','RANK 1'), (2,'02','RANK 2'), (3,'03','RANK 3')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2014-01-01
      • 2010-12-27
      相关资源
      最近更新 更多