首页 > 解决方案 > 如果 2 行在 2 列中有数据匹配,则排除数据行

问题描述

设置:数据存储在 hadoop 和 Impala 中的查询。

我正在尝试创建一个查询,该查询允许我获取我们从客户那里看到的交付的明细(他们的交付是我们在数据库中看到的所有行的计数,在给定的时期内。为了做到这个,我需要排除我们在一行上重复计算的地方,所以我们只计算 1 而不是计算 2+ 行。

在这种情况下,双重计数是 2 列具有完全相同的行数据。

示例:在下表中,我应该能够运行查询,因此我从我对“C4”的计数中删除了第 1 行,因为前 2 行有 2 列匹配。

TABLE = table
c1 = string
c2 = bigint

C1    || C2         || C3  || C4
--------------------------
a     || 1          || a   || 1
a     || 1          || a   || 1
a     || 2          || b   || 1
a     || 3          || a   || 1
a     || 4          || b   || 1
b     || 2          || c   || 1
c     || 1          || d   || 1
c     || 2          || d   || 1

返回所有行的当前查询:

SELECT c1,
       c3,
       count(c4) AS 'delivery'
FROM table
WHERE c1 = 'a'
GROUP BY c1, c3

根据我在网上检查的内容,我需要创建一个子查询来识别这些行,但是我没有任何运气正确地做到这一点并进入了一个兔子洞,在那里我试图创建一个新的行,它结合了下面的 2 列:

SELECT
        UNIQUE = c2 + cast(c1 as BIGINT)
FROM table
WHERE month = month(now())

然后,我将从这个新行中查看唯一的行,但我确信可能有类似的方法可以实现我的目标。

从上表示例中,我的目标是看到以下结果:

c1     c3      delivery
a      a       2
a      b       1

感谢您提供的任何建议。

标签: sqlimpalahue

解决方案


我想你想要窗口功能。对于唯一行:

SELECT t.*
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY c1, c2 ORDER BY c1) as seqnum
      FROM t
     ) t
WHERE seqnum = 1;

对于聚合:

SELECT t.c1, COUNT(*)
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY c1, c2 ORDER BY c1) as seqnum
      FROM t
     ) t
WHERE seqnum = 1
GROUP BY c1;

如果后者是你想要的,你也可以使用:

SELECT c1, COUNT(DISTINCT c2)
FROM t
GROUP BY c1;

推荐阅读