在DB2中使用连接计算表的模式的最有效方法是什么。
我试图在给定日期获取给定列(ID - 连接表的候选键)的频率(计数)最多的值。
这个想法是从表中获得最常见的(值),对于某些帐户(对于相同的ID和日期),它具有不同的(值)s。我们需要使它在另一个表中使用它是唯一的。
答案 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(*)并查找销售量最多的单位。