vertica 生成 table 数字和 select 素数
vertica generate table with numbers & select prime numbers
我正在使用 Vertica 版本 8+
我需要创建一个 table,其中包含从 1 到 N 的数字和 select 素数
我已经在 SQLite3 中做到了,但是 Vertica 不允许递归 WITH
https://forum.vertica.com/discussion/206185/recursive-queries
编辑:
WITH seq AS (
SELECT n FROM (
SELECT ROW_NUMBER() OVER() AS n
FROM (
SELECT 1
FROM (
SELECT date(0) + INTERVAL '1 second' AS i
UNION ALL
SELECT date(0) + INTERVAL '100 seconds' AS i
) _
TIMESERIES tm AS '1 second' OVER(ORDER BY i)
) _
) _
WHERE n > 1 -- 1 is not prime number
)
SELECT n
FROM (SELECT n FROM seq) _
WHERE n NOT IN (
SELECT n FROM (
SELECT s1.n AS n, s2.n AS n2
FROM seq AS s1
CROSS JOIN seq AS s2
ORDER BY n, n2
) _
WHERE n2 < n AND n % n2 = 0
)
ORDER BY n
你不需要为此递归 WITH。
第一步。您需要生成从 1 到 N 的所有数字(比如 1000)。您可以使用 TIMESERIES 在 Vertica 中轻松执行此操作。以下将生成从 1 到 1000 的所有数字:
WITH seq AS (
SELECT ROW_NUMBER() OVER() AS num FROM (
SELECT 1 FROM (
SELECT date(0) + INTERVAL '1 second' AS se UNION ALL
SELECT date(0) + INTERVAL '1000 seconds' AS se ) a
TIMESERIES tm AS '1 second' OVER(ORDER BY se)
) b
)
SELECT num FROM seq ;
num
------
1
2
3
4
...
997
998
999
1000
第二步我们只需要从上面的结果集中排除非素数数字(参见here, here and here) :
WITH seq AS (
SELECT ROW_NUMBER() OVER() AS num FROM (
SELECT 1 FROM (
SELECT date(0) + INTERVAL '1 second' AS se UNION ALL
SELECT date(0) + INTERVAL '1000 seconds' AS se ) a
TIMESERIES tm AS '1 second' OVER(ORDER BY se)
) b
)
SELECT num as prime
FROM seq
WHERE num NOT IN (
SELECT s1.num * s2.num
FROM seq s1 CROSS JOIN seq s2
WHERE s1.num BETWEEN 2 AND CEILING (SQRT (1000))
AND s1.num <= s2.num
AND s2.num * s1.num <= 1000
)
ORDER BY 1
;
prime
-------
1
2
3
5
7
11
...
977
983
991
997
我正在使用 Vertica 版本 8+
我需要创建一个 table,其中包含从 1 到 N 的数字和 select 素数
我已经在 SQLite3 中做到了,但是 Vertica 不允许递归 WITH
https://forum.vertica.com/discussion/206185/recursive-queries
编辑:
WITH seq AS (
SELECT n FROM (
SELECT ROW_NUMBER() OVER() AS n
FROM (
SELECT 1
FROM (
SELECT date(0) + INTERVAL '1 second' AS i
UNION ALL
SELECT date(0) + INTERVAL '100 seconds' AS i
) _
TIMESERIES tm AS '1 second' OVER(ORDER BY i)
) _
) _
WHERE n > 1 -- 1 is not prime number
)
SELECT n
FROM (SELECT n FROM seq) _
WHERE n NOT IN (
SELECT n FROM (
SELECT s1.n AS n, s2.n AS n2
FROM seq AS s1
CROSS JOIN seq AS s2
ORDER BY n, n2
) _
WHERE n2 < n AND n % n2 = 0
)
ORDER BY n
你不需要为此递归 WITH。
第一步。您需要生成从 1 到 N 的所有数字(比如 1000)。您可以使用 TIMESERIES 在 Vertica 中轻松执行此操作。以下将生成从 1 到 1000 的所有数字:
WITH seq AS (
SELECT ROW_NUMBER() OVER() AS num FROM (
SELECT 1 FROM (
SELECT date(0) + INTERVAL '1 second' AS se UNION ALL
SELECT date(0) + INTERVAL '1000 seconds' AS se ) a
TIMESERIES tm AS '1 second' OVER(ORDER BY se)
) b
)
SELECT num FROM seq ;
num
------
1
2
3
4
...
997
998
999
1000
第二步我们只需要从上面的结果集中排除非素数数字(参见here, here and here) :
WITH seq AS (
SELECT ROW_NUMBER() OVER() AS num FROM (
SELECT 1 FROM (
SELECT date(0) + INTERVAL '1 second' AS se UNION ALL
SELECT date(0) + INTERVAL '1000 seconds' AS se ) a
TIMESERIES tm AS '1 second' OVER(ORDER BY se)
) b
)
SELECT num as prime
FROM seq
WHERE num NOT IN (
SELECT s1.num * s2.num
FROM seq s1 CROSS JOIN seq s2
WHERE s1.num BETWEEN 2 AND CEILING (SQRT (1000))
AND s1.num <= s2.num
AND s2.num * s1.num <= 1000
)
ORDER BY 1
;
prime
-------
1
2
3
5
7
11
...
977
983
991
997