计算模式 - “最高频率行”DB2

时间:2012-08-23 19:02:36

标签: db2

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

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

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

1 个答案:

答案 0 :(得分:1)

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

假设我们想知道每个项目的哪种风味在每个日期销售最频繁(可能假设记录是数量一)。

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”部分的摘要行上具有Tally值的RANK()。 Tally正在下降,因为我们首先需要最大的值,这将得到RANK()为1.然后在主SELECT中我们只选择那些在他们的分区中第一个的摘要记录。

通过使用RANK()或DENSE_RANK(),我们可以获得itemID,saleDate的多种风格,如果它们并列第一名的话。这可以通过用ROW_NUMBER()替换RANK()来消除,但它会任意选择其中一个并列的风格作为胜利者,这可能不是正确的答案。

如果我们在表格中有一个销售数量列,我们可以用SUM(salesqty)替换COUNT(*)并查找销售量最多的单位。