5

我有一个看起来与此类似的 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 行,因为在下一行重复了,我STYLEC需要包含它(所以我实际上会有 4 行)。

上面的示例,我希望结果集如下所示:

STYLE     |     CUSTOMER     |     SIZE     |      COLOUR      |
-----------------------------------------------------------------
A               DWTG               S               BLUE
B               DWTG               S               RED
C               DWTG               S               GREEN
C               DWTG               M               GREEN

这是因为我们将数据导入到其中的 ERP 具有文件大小限制,因此我需要将结果集拆分为较小的文件,但我需要将相同的记录(STYLE 中的相同值)保存在一起。

我正在考虑某种窗口函数,它会TOP n根据下一行是否具有相同的样式动态地添加一个数字。

有任何想法吗?

4

2 回答 2

10

听起来你想要这个:

select top 3 with ties *
from yourtable
order by style

请参阅带有演示的 SQL Fiddle

编辑#1:查看更新的sql fiddle 与您的附加数据

结果:

| STYLE | CUSTOMER | SIZE | COLOUR |
------------------------------------
|     A |     DWTG |    S |   BLUE |
|     B |     DWTG |    S |    RED |
|     C |     DWTG |    S |  GREEN |
|     C |     DWTG |    M |  GREEN |
于 2012-12-20T22:12:41.070 回答
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

于 2012-12-20T22:17:06.680 回答