我如何 select sql 服务器 2012 中另一个 table 中的每个父主键 table 的给定行数?
How do I select a given number of rows for one table for each parent primary key in another table in sql server 2012?
我在 sql 中有两个 table。一个是 table 测试用例,另一个是 table 测试运行,外键链接回测试用例。我想为每个测试用例获取最近的 10 次测试运行。如果不需要,我不想循环,但我没有看到任何其他方法来解决这个问题。在 sql 服务器中处理此类事情的最有效方法是什么?
想法:
select
...
from <test cases> as tc
outer apply (
select top 10 *
from <test runs> as tr
where
tr.<test case id> = tc.<id>
order by tr.<date time> desc
) as tr
或者,如果您只需要从 table 获取数据:
;with cte_test_runs as (
select
*,
row-Number() over(partition by <test case id> order by <date time> desc) as rn
from <test runs>
)
select *
from cte_test_runs
where rn <= 10
可以使用Row No. 视情况使用Inner of Left Join..
Select * from testCase a
left outer join
(Select Row_number() over (partition by testcase order by RecentDate desc ) RowNo, * from TestRuns) b
on a.pk = b.fk
where b.RowNo <=10
您可以使用 CROSS APPLY select 按日期(或任何其他排序标准)排序的每个测试用例的前 10 个。
请参阅相关问题 'When should I use Cross Apply over Inner Join?',它比我能解释得更好。
你的情况:
SELECT * from TestCase T
CROSS APPLY
( SELECT TOP 10 * from TestRuns R where T.TestCaseId = R.TestCaseId
order by R.TestDate desc) TopResults
我在 sql 中有两个 table。一个是 table 测试用例,另一个是 table 测试运行,外键链接回测试用例。我想为每个测试用例获取最近的 10 次测试运行。如果不需要,我不想循环,但我没有看到任何其他方法来解决这个问题。在 sql 服务器中处理此类事情的最有效方法是什么?
想法:
select
...
from <test cases> as tc
outer apply (
select top 10 *
from <test runs> as tr
where
tr.<test case id> = tc.<id>
order by tr.<date time> desc
) as tr
或者,如果您只需要从 table 获取数据:
;with cte_test_runs as (
select
*,
row-Number() over(partition by <test case id> order by <date time> desc) as rn
from <test runs>
)
select *
from cte_test_runs
where rn <= 10
可以使用Row No. 视情况使用Inner of Left Join..
Select * from testCase a
left outer join
(Select Row_number() over (partition by testcase order by RecentDate desc ) RowNo, * from TestRuns) b
on a.pk = b.fk
where b.RowNo <=10
您可以使用 CROSS APPLY select 按日期(或任何其他排序标准)排序的每个测试用例的前 10 个。
请参阅相关问题 'When should I use Cross Apply over Inner Join?',它比我能解释得更好。
你的情况:
SELECT * from TestCase T
CROSS APPLY
( SELECT TOP 10 * from TestRuns R where T.TestCaseId = R.TestCaseId
order by R.TestDate desc) TopResults