使用子查询从 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 是你的下一列。这意味着您的系统不必在每次运行时都执行代价高昂的排序,但这取决于您是否计划经常使用此查询以及它占用了多少开销。
当我向右加入时 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 是你的下一列。这意味着您的系统不必在每次运行时都执行代价高昂的排序,但这取决于您是否计划经常使用此查询以及它占用了多少开销。