如果 2 行在 2 列中有数据匹配,则排除数据行

Posted

技术标签:

【中文标题】如果 2 行在 2 列中有数据匹配,则排除数据行【英文标题】:Excluding data rows if 2 rows have data matching in 2 columns 【发布时间】:2019-10-05 20:31:12 【问题描述】:

设置:数据存储在 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

感谢您提供的任何建议。

【问题讨论】:

【参考方案1】:

我认为你想要窗口函数。对于唯一行:

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;

【讨论】:

感谢 Gordon 的建议,我已经尝试了两个选项,没有 1 返回与“组”相关的错误。我在其他行中尝试过这一点但失败了。这是我目前正在尝试的: SELECT c1, c3, count() AS 'delivery' FROM table; GROUP BY c1, c3 FROM (SELECT tabe., ROW_NUMBER() OVER (PARTITION BY c1, c2 ORDER BY c1) as seqnum FROM table ) 能够 WHERE c1 = 'a' AND seqnum = 1 no 2 doesn't符合我的比较。是否仅根据 c2 是否不同而不是 c1+c2 的组合是否不同才返回?

以上是关于如果 2 行在 2 列中有数据匹配,则排除数据行的主要内容,如果未能解决你的问题,请参考以下文章

C# 数据表。比较列中的数据,如果匹配,则追加相应行另一列中的数据

Excel - 如何比较 2 列中的单元格,然后如果 B 列匹配,则使用 B 列中匹配单元格旁边的 C 列中的值?

如果值与在 r 中有条件删除的值匹配,则删除行

VBA - 根据具有数据的相邻单元格的计数插入行

每天获取一个非常大的 Pandas DataFrame 中所有行的总和,这些行在两个特定列中匹配

如果 A 列中的单元格为空白,则针对不同工作表中的数据集查找 B 列