使用子查询从 Right table 获取最新记录

Get most recent record from Right table with sub query

当我向右加入时 table 我得到了太多重复项。我正在尝试从右侧获取最新记录 table 但是,无论我尝试什么都没用。

到目前为止我已经尝试过:

PROC SQL;
CREATE TABLE fs1.sample AS
    SELECT A.*,
               B.xx1,
           max(B.time_s) 

FROM lx1.results a left join (Select Distinct C.id, c.per FROM lx2.results c 
                          Where c.id = a.id
                              and COMPGED(a.txt1, c.txt1,'i') < 100
                              and c.dt > a.dt
                  and c.ksv = 37
                  and datepart(c.lsg) >= '12DEC2020'd ) b
ON a.id = b.id
group by a.id, a.txt1
QUIT;

不幸的是,我得到一个错误。我也尝试过使用 case when exists,但这花费的时间太长了。本质上我是想根据time_s从右边table抓取最近的记录。我还想确保我从右边 table 抓取的记录与 a.txt1.

有点匹配

干杯

执行联接时,您会附加 table 中符合联接条件的所有记录。

如果 table 被适当地索引,子查询可以达到获取最近值的目的,但是,如果查询使用了错误的索引,TOP 或等效函数可能 return结果错误。

有多种方法可以完成检索最新记录的任务,但它们取决于几件事。

首先,您需要能够识别最近的行是什么,通常是通过名为 CreatedDate 的列或与 ID 类似的内容。 (您应该知道业务逻辑是什么,可能 table 是按时间顺序输入的 [就像大多数 table 一样],因此,SubID 可能是一回事。我们将假设它是创建日期。)

其次,需要按照CreatedDate降序排列,使最新匹配的ID排在第1位。

最后,您按 1 过滤结果到 return 最新结果,但如果您对每个 ID 的前 x 个最新 return 结果感兴趣,也可以按 <= x 过滤。

使用更多数学语言:我们从 CreatedDate 和 ID 值中导出一个值,然后使用该导出值对数据进行排序和过滤。在这种情况下,我们按每个 ID 的降序从 CreatedDate 派生 RowNumber。

为了实现这一点,您可以使用窗口函数 ROW_NUMBER(),

ROW_NUMBER() OVER (PARTITION BY id ORDER BY CreatedDate DESC) as RankID

此窗口函数将 return 每个 ID 的行值相对于 CreatedDate 按降序排列,其中最新的创建日期等于 1。

然后您可以将整个查询括起来,使其成为 table,这样您就可以过滤该窗口函数的结果。

SELECT id, txt
    (SELECT id, txt
     ,ROW_NUMBER() OVER (PARTITION BY id ORDER BY CreatedDate DESC) as RankID
      FROM SourceTable) A
WHERE RankID = 1

这应该可以实现您 return 获取“最新结果”的目标。

确定数据相对于 ID 的年龄的列是什么,它可以是多个,应该放在 ORDER BY 中。

为了使这个查询执行得更快,你应该适当地索引你的数据,其中 ID 是第一列,CreatedDate Desc 是你的下一列。这意味着您的系统不必在每次运行时都执行代价高昂的排序,但这取决于您是否计划经常使用此查询以及它占用了多少开销。