1

在 DB2 中使用连接计算跨表模式的最有效方法是什么?

我试图在给定日期获取给定列(ID - 连接表的候选键)的频率(计数)最高的值。

这个想法是从表中获取最常见的(值),该表对于某些帐户(对于相同的 ID 和日期)具有不同的(值)。我们需要使它在另一个表中使用是唯一的。

4

1 回答 1

1

您可以使用由 表示的公用表表达式 [CTE's]WITH将逻辑分解为逻辑步骤。首先,我们将构建摘要行,然后为每个组中的行分配排名,然后挑选出记录数最多的行。

假设我们想知道每种商品的哪种口味在每个日期最常销售(也许假设记录是第一数量)。

WITH s as
( 
  SELECT itemID, saleDate, flavor, count(*) as tally
    FROM sales
    GROUP BY itemID, saleDate, flavor
), r as
( 
  SELECT itemID, saleDate, flavor, tally, 
         RANK() OVER (PARTITION BY itemID, saleDate ORDER BY tally desc) as pri
    FROM s
)
SELECT itemID, saleDate, flavor, tally
  FROM r
  WHERE pri = 1

这里的名称“s”和“r”指的是它们各自 CTE 的结果集。然后可以使用这些名称来表示语句的另一部分中的表。

pri 列将在 itemID 和 saleDate 窗口内的第一部分“s”的摘要行上具有计数值的 RANK()。Tally 是递减的,因为我们首先想要最大值,这将获得 RANK() 为 1。然后在主 SELECT 中,我们只需选择那些在其分区中排在首位的摘要记录。

通过使用 RANK() 或 DENSE_RANK(),我们可以获得 itemID、saleDate 的多个风味,如果它们并列第一。这可以通过将 RANK() 替换为 ROW_NUMBER() 来消除,但它会任意选择一种并列的口味作为获胜者,这可能不是手头问题的正确答案。

如果我们在表中有一个销售数量列,我们可以将 COUNT(*) 替换为 SUM(salesqty) 并找出销量最多的产品。

于 2012-08-23T23:59:46.970 回答