sql—如果两行在两列中有数据匹配,则排除数据行

f3temu5u  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(370)

设置:数据存储在hadoop上,查询存储在impala中。
我正在尝试创建一个查询,它允许我对我们从客户机看到的交付进行细分(他们的交付是我们在给定时间段内在数据库中看到的所有行的计数)。为了做到这一点,我需要排除我们在一行上重复计算的地方,所以我们不计算2+行,只计算1。
此示例中的双重计数是指两列具有完全相同的行数据。
示例:在下表中,我应该能够运行一个查询,因此我从“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

根据我在网上查到的内容,我需要创建一个子查询来识别这些行,但是我没有幸运地正确地做到这一点,我进入了一个兔子洞,在那里我尝试创建一个新行,它将下面的两列组合在一起:

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

从这一行开始,我只想回顾一下那些独特的行,但我相信可能有类似的方法来实现我的目标。
从上表示例中,我希望看到以下结果:

c1     c3      delivery
a      a       2
a      b       1

感谢您的推荐。

jpfvwuh4

jpfvwuh41#

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

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;

相关问题