选择前n行

时间:2012-12-20 22:06:26

标签: 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

现在,我需要拆分此结果集并获取前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添加一个数字。

有什么想法吗?

2 个答案:

答案 0 :(得分:10)

听起来你想要这个:

select top 3 with ties *
from yourtable
order by style

请参阅SQL Fiddle with Demo

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

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