-
20-12-2019 - |
题
我在同一表中有2个不同的查询。第一个是形式 -
SELECT MIN(A) AS MIN_A, MAX(B) AS MAX_B
FROM myTable
WHERE timeStamp > ?
GROUP BY type;
.
和另一个:
SELECT SUM (CASE WHEN io > 0 THEN 1 ELSE 0 END) as io_cnt
FROM (
SELECT
(CASE WHEN SUM(io_ops) > 0 THEN 1 ELSE 0 END) as io
FROM myTable
WHERE timestamp > ? AND type = ?
GROUP BY id
) t;
.
和表有列 - a,b,ID,时间戳,类型。 现在我呼唤java的第一个查询,取出结果集输出并循环,呼叫第一个查询中返回的每个类型的第二个查询。
我需要两个min(a),首先查询的MAX(B),并且IO计数来自第二个查询。是否有可能在一个查询中进行?我正在使用Amazon Redshift作为我的数据库。
解决方案
redshift是相当限的。它基于PostgreSQL 8.0.2,不支持许多新功能。这应该是工作(未经测试):
SELECT t.type, min(min_a) AS min_a, max(max_b) AS max_b
,count(io > 0 OR NULL) AS io_cnt
FROM (
SELECT type, min(a) as min_a, max(b) as max_b
,sum(io_ops) AS io
FROM myTable
WHERE timestamp > ?
GROUP BY type, id
) t
GROUP BY t.type;
.
取决于数据分布,这可能会更快或更快:
SELECT t.type, m.min_a, m.max_b, count(io > 0 OR NULL) AS io_cnt
FROM (
SELECT type, sum(io_ops) AS io
FROM myTable
WHERE timestamp > ?
GROUP BY type, id
) t
JOIN (
SELECT type, min(a) as min_a, max(b) as max_b
FROM myTable
WHERE timeStamp > ?
GROUP BY type
) m USING (type)
GROUP BY t.type, m.min_a, m.max_b;
. 不隶属于 StackOverflow