选择前n行

Loc*_*ock 5 sql sql-server

我有一个类似于此的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排,因为STYLEC重复的下一行,我需要包括这个问题,以及(所以我实际上有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)

请参阅SQL Fiddle with Demo

编辑#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)


Orl*_*teo 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;
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/ms189798.aspx