sql - 如果 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
感谢您提供的任何建议。
解决方案
我想你想要窗口功能。对于唯一行:
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;
推荐阅读
- python - 如何在 GitHub 上拉取请求后运行脚本?
- node.js - 从 cli 生成新的 Angular 应用程序引发 npm 错误
- nginx - Nginx 在子目录中分离应用程序
- c# - WPF 控件绑定并不总是更新 UI
- python-3.x - 无法导入“scrapy_splash”pylint(导入错误)
- apache-spark-sql - 如何在使用字典时使用 replace() 方法替换列值?
- python - 如何修复这个 NumPy loadtxt 函数?
- python - 将 docx 转换为 html 会引发 python MemoryError
- r - 使用 dplyr 根据分组变量计算列 NA
- machine-learning - 为什么 ALS 可以很容易地并行计算?