我有一个类似于此的SQL结果集,并由STYLE排序:
STYLE | CUSTOMER | SIZE | COLOUR |
-----------------------------------------------------------------
A DWTG S BLUE
B DWTG S RED
C DWTG S GREEN
C DWTG M GREEN
D DWTG S ORANGE
D DWTG M ORANGE
D DWTG L ORANGE
Run Code Online (Sandbox Code Playgroud)
现在,我需要拆分此结果集并获取前1000行.没问题,我可以用TOP 1000.
我的问题是,与上面的例子,如果我想,说的前3排,因为STYLE有C重复的下一行,我需要包括这个问题,以及(所以我实际上有4行).
上面的例子,我希望结果集看起来像:
STYLE | CUSTOMER | SIZE | COLOUR |
-----------------------------------------------------------------
A DWTG S BLUE
B DWTG S RED
C DWTG S GREEN
C DWTG M GREEN
Run Code Online (Sandbox Code Playgroud)
这是因为我们导入数据的ERP具有文件大小限制,因此我需要将结果集拆分为较小的文件,但我需要将相同的记录(STYLE中的值相同)保存在一起.
我正在考虑一种某种类型的窗口函数,TOP n如果下一行具有相同的样式,它会动态地添加一个数字.
有任何想法吗?
Tar*_*ryn 10
听起来你想要这个:
select top 3 with ties *
from yourtable
order by style
Run Code Online (Sandbox Code Playgroud)
编辑#1:查看更新的sql小提示您的其他数据
结果:
| STYLE | CUSTOMER | SIZE | COLOUR |
------------------------------------
| A | DWTG | S | BLUE |
| B | DWTG | S | RED |
| C | DWTG | S | GREEN |
| C | DWTG | M | GREEN |
Run Code Online (Sandbox Code Playgroud)
使用DENSE_RANK()尝试这样的事情:
WITH cte
AS ( SELECT STYLE,
CUSTOMER,
DENSE_RANK() OVER ( ORDER BY STYLE ) AS d_rank
FROM dbo.x
)
SELECT STYLE,
CUSTOMER
FROM cte
WHERE d_rank <= 3;
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/en-us/library/ms189798.aspx