我的MS SQL数据库中有一个名为PolicyTransactions的表。该表有两个重要的列:
trans_id INT IDENTITY(1,1),
policy_id INT NOT NULL,
我需要帮助编写一个查询,该查询将为表中的每个trans_id / policy_id将其连接到该policy_id的最后一个trans_id。这似乎是一个简单的查询,但由于某种原因,我现在无法在脑中得到凝胶。
谢谢!
答案 0 :(得分:2)
我为你做了这个......希望你正在寻找它:http://sqlfiddle.com/#!6/e7dc39/8
基本上,cross apply
与subquery
或常规join
不同。它是一个查询,它根据查询外部返回的每一行执行。这就是为什么它可以看到外部表(子查询不具备这种能力),这就是为什么它使用旧学校连接语法(旧学校意味着 _ = _ 的join
条件strong>在where
子句中。
对这个解决方案非常小心,因为交叉应用并不是地球上最快的事情。但是,如果表上的索引是正确的,那么这个微小的查询应该会很快运行。
这是我能想到解决它的唯一方法,但它并不意味着唯一的方法!
只是一个超级快速编辑:如果您注意到,某些行不会返回,因为它们是FIRST策略,因此不会使用相同策略编号的tran_id小于它们。如果您想使用应用模拟outer join
,请使用outer apply
:)
答案 1 :(得分:2)
如果您使用的是SQL Server 2012或更高版本,则应使用LAG()功能。请参阅下面的代码段,我觉得它比这里给出的其他答案更清晰。
SELECT trans_id, policy_id, LAG(trans_id) OVER (PARTITION BY policy_id ORDER BY trans_id)
FROM PolicyTransaction