我有一个类似于此的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
现在,我需要拆分此结果集并获取前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
这是因为我们导入数据的ERP具有文件大小限制,因此我需要将结果集拆分为较小的文件,但我需要将相同的记录(STYLE中的值相同)保存在一起。 / p>
我在考虑某种窗口函数,根据下一行是否具有相同的样式,动态地向TOP n
添加一个数字。
有什么想法吗?
答案 0 :(得分:10)
听起来你想要这个:
select top 3 with ties *
from yourtable
order by style
编辑#1:查看更新的sql fiddle with your additional data
结果:
| STYLE | CUSTOMER | SIZE | COLOUR |
------------------------------------
| A | DWTG | S | BLUE |
| B | DWTG | S | RED |
| C | DWTG | S | GREEN |
| C | DWTG | M | GREEN |
答案 1 :(得分:6)
使用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;