1

我有一种情况,我需要根据表中的设置和序数集仅显示顶行。

下面的示例数据集显示了两个客户;每个客户都有不同的产品。由于NumRowsToShow是“1”,我只想为每个客户显示一行(基于序数的第一行)。

| CustomerID | ProductID | Ordinal | NumRowsToShow |
+------------+-----------+---------+---------------+
| 1          |A          |1        |1              |
| 1          |B          |2        |1              |
| 1          |C          |3        |1              |
| 5          |D          |1        |1              |
| 5          |E          |2        |1              |
| 5          |F          |3        |1              |

查询运行后的结果集应该是

| CustomerID | ProductID |
+------------+-----------+
| 1          |A          |
| 5          |D          |

在相同的场景中,如果NumRowsToShowcustomerID 1 为 1,CustomerID 5 为 2,我会看到类似的东西。

| CustomerID | ProductID | Ordinal | NumRowsToShow |
+------------+-----------+---------+---------------+
| 1          |A          |1        |1              |
| 1          |B          |2        |1              |
| 1          |C          |3        |1              |
| 5          |D          |1        |2              |
| 5          |E          |2        |2              |
| 5          |F          |3        |2              |

查询运行后的结果集应该是

| CustomerID | ProductID |
+------------+-----------+
| 1          |A          |
| 5          |D          |
| 5          |E          |

如何才能做到这一点?

包括一个实际结果集的屏幕截图,其中包含我试图过滤的内容的亮点,这可能会有所帮助。

屏幕截图
(来源:harpernet.net

4

1 回答 1

6

感觉就像“考试作弊”:

SELECT CustomerID, ProductID
FROM tableX
WHERE Ordinal <= NumRowsToShow

如果正如评论所暗示的那样,Ordinal可以有10, 20, 30值而不仅仅是1, ..., n值,那么这将起作用:

SELECT t.CustomerID, t.ProductID
FROM tableX AS t
  JOIN tableX AS tt
    ON  tt.CustomerID = t.CustomerID
    AND tt.Ordinal <= t.Ordinal
GROUP BY t.CustomerID
       , t.ProductID
       , t.NumRowsToShow
HAVING COUNT(*) <= t.NumRowsToShow

甚至更好的是:

SELECT CustomerID, ProductID
FROM
  ( SELECT CustomerID, ProductID, NumRowsToShow
         , ROW_NUMBER() OVER( PARTITION BY CustomerID 
                              ORDER BY Ordinal
                            ) AS Rn
    FROM tableX
  ) AS tmp
WHERE Rn <= NumRowsToShow ;

测试:SQL-Fiddle


您的表格看起来没有标准化。这些NumRowsToShow列具有重复的信息,这可能导致更新异常。这:

| CustomerID | ProductID | Ordinal | NumRowsToShow |
+------------+-----------+---------+---------------+
| 1          |A          |1        |1              |
| 1          |B          |2        |1              |
| 1          |C          |3        |1              |
| 5          |D          |1        |2              |
| 5          |E          |2        |2              |
| 5          |F          |3        |2              |

可以归一化为2个表:

| CustomerID | ProductID | Ordinal |
+------------+-----------+---------+
| 1          |A          |1        |
| 1          |B          |2        |
| 1          |C          |3        |
| 5          |D          |1        |
| 5          |E          |2        |
| 5          |F          |3        |

和:

| CustomerID | NumRowsToShow |
+------------+---------------+
| 1          |1              |
| 5          |2              |
于 2012-04-11T18:58:18.173 回答