我经常需要从结果集中的每个组中选择一些行。
例如,我可能想列出每个客户最近的“n”个最高或最低订单值。
在更复杂的情况下,要列出的行数可能因组而异(由分组/父记录的属性定义)。这部分绝对是可选的/为了额外的学分,而不是为了劝阻人们回答。
在 SQL Server 2005 及更高版本中解决这些类型问题的主要选项是什么?每种方法的主要优点和缺点是什么?
AdventureWorks 示例(为清晰起见,可选)
TransactionHistory,每个产品以从 M 到 R 的字母开头。n每个产品都有历史记录行,其中n是DaysToManufactureProduct 属性的五倍。TransactionDate, .tie-break on TransactionID.我有一个 500 行的结果集,但这是 100 张发票。我只需要最后一张发票的前 10 个。
我发现了类似的东西:如何从每个类别中选择前 10 条记录
样本数据:
InvNr | DetailLine
111 | 1
111 | 2
112 | 1
112 | 2
112 | 3
113 | 1
113 | 2
114 | 1
115 | 1
... | ...
Run Code Online (Sandbox Code Playgroud)
我希望得到的是例如:
SELECT DISTINCT TOP 2 InvNr, DetailLine FROM tbl_Invoice
Run Code Online (Sandbox Code Playgroud)
有了这个结果:
InvNr | DetailLine
111 | 1
111 | 2
112 | 1
112 | 2
112 | 3
Run Code Online (Sandbox Code Playgroud)
更新:
所以我需要他们创建的最后 10 个(或上例中的前 2 个)发票,但每个发票可以有“x”个明细行,我希望结果中的所有明细行(最后 10 …