2017-07-09 8 views
1

を選択SQLite3のが、のVerticaに編集にVertica私は私が「1からNまでの番号を持つテーブルを作成し、素数に</strong></p> <p>を選択する必要がありますのVerticaのバージョン8+</p> <p><strong>に取り組んでいる数字でテーブルを生成&素数

https://forum.vertica.com/discussion/206185/recursive-queries

WITH再帰許可していないことをやって達成しまし:

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 

答えて

3

このために再帰的なWITHは必要ありません。

第1ステップ。 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 

第2の工程は、我々は単に(hereherehereを参照)の上に、ここで設定した結果から非プライム番号を除外する必要があります。

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 
関連する問題