我们可以在clickhouse中使用下一个语法:
select id, max(value1), any(value2) from scheme.table group by id
我知道我可以只使用 max 或 min 函数,但我需要更快的方法
根据https://docs.vertica.com/23.4.x/en/sql-reference/functions/,没有直接模拟
但是你可以尝试使用 FIRST_VALUE + ORDER BY RANDOM()
SELECT DISTINCT
id,
FIRST_VALUE(value) OVER (PARTITION BY id ORDER BY RANDOM()) AS any_value
FROM table
ANY()
将返回随机选取的值,所以我同意@Slach的答案 - 但由于您的要求是速度,我在专用查询中使用Vertica的分析限制子句来随机选取any value2内容,并且将其加入主查询。
WITH
-- some sample data that we would have expected from you ....
indata(id,value1,value2) AS (
SELECT 1,32,42
UNION ALL SELECT 1,33,43
UNION ALL SELECT 1,34,44
UNION ALL SELECT 1,35,45
UNION ALL SELECT 1,36,46
UNION ALL SELECT 2,32,42
UNION ALL SELECT 2,33,43
UNION ALL SELECT 2,34,44
UNION ALL SELECT 2,35,45
UNION ALL SELECT 2,36,46
)
-- real query starts here, replace following comma with "WITH"
,
anyvalue2 AS (
SELECT
id
, value2
FROM indata
LIMIT 1 OVER(PARTITION BY id ORDER BY RANDOM())
)
SELECT
indata.id
, MAX(value1) AS value1
, anyvalue2.value2
FROM indata
JOIN anyvalue2 USING(id)
GROUP BY 1,3
ORDER BY 1
;
-- out id | value1 | value2
-- out ----+--------+--------
-- out 1 | 36 | 46
-- out 2 | 36 | 42