Advertisement
Guest User

Detect three consecutive results

a guest
Aug 12th, 2022
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.84 KB | None | 0 0
  1.  
  2. DROP TABLE IF EXISTS temp_rand; -- 16ms
  3. CREATE TABLE temp_rand ( --  0.25s
  4.     "row_num"   BIGINT      PRIMARY KEY,
  5.     "gid"       INTEGER     NOT NULL,
  6.     "id"        INTEGER     NOT NULL,
  7.     "rid"       INTEGER     NOT NULL
  8. );
  9. INSERT INTO temp_rand -- 19.59s
  10. SELECT
  11.     num AS "row_num",
  12.     RANDOM(1, 3) AS "gi",
  13.     RANDOM(1, 12) AS "id",
  14.     RANDOM(1, 2) AS "ri"
  15. FROM master.integers_100m
  16. ;
  17. DROP TABLE IF EXISTS find_triples; -- 31ms
  18. CREATE TABLE find_triples ( -- 0.39s
  19.     "row_num"   BIGINT      PRIMARY KEY,
  20.     "group"     VARCHAR(10) NOT NULL,
  21.     "id"        INTEGER     NOT NULL,
  22.     "result"    CHAR(1)     NOT NULL
  23. );
  24. INSERT INTO find_triples -- 31.71s
  25. WITH grp AS (
  26.     SELECT 1 AS "gid", 'Green' AS "group"   UNION ALL
  27.     SELECT 2 AS "gid", 'Blue'  AS "group"   UNION ALL
  28.     SELECT 3 AS "gid", 'Red'   AS "group"
  29. ),
  30. res AS (
  31.     SELECT 1 AS "rid", 'A' AS "result"      UNION ALL
  32.     SELECT 2 AS "rid", 'B' AS "result"
  33. )
  34. SELECT
  35.     temp_rand.row_num,
  36.     grp.GROUP,
  37.     temp_rand.id,
  38.     res.RESULT
  39. FROM temp_rand
  40. JOIN grp ON grp.gid = temp_rand.gid
  41. JOIN res ON res.rid = temp_rand.rid
  42. ;
  43. -- Check distribution
  44. SELECT id,     COUNT(1) FROM find_triples GROUP BY 1; -- 0.23s
  45. SELECT RESULT, COUNT(1) FROM find_triples GROUP BY 1; -- 0.23s
  46. SELECT GROUP,  COUNT(1) FROM find_triples GROUP BY 1; -- 1.35s
  47. -- Count triples: cases where the result & group are the same on three consecutive rows
  48. -- In the case of 4, 5, 6 return 2, 3, 4 for now
  49. WITH tests AS ( -- 56.02s
  50.     SELECT
  51.         CASE
  52.             WHEN LEAD(RESULT) OVER (ORDER BY row_num) IS NULL   THEN 0
  53.             WHEN LAG(RESULT)  OVER (ORDER BY row_num) IS NULL   THEN 0
  54.             WHEN LEAD(RESULT) OVER (ORDER BY row_num) != RESULT THEN 0
  55.             WHEN LAG(RESULT)  OVER (ORDER BY row_num) != RESULT THEN 0
  56.             WHEN LEAD(GROUP)  OVER (ORDER BY row_num) != GROUP  THEN 0
  57.             WHEN LAG(GROUP)   OVER (ORDER BY row_num) != GROUP  THEN 0
  58.             ELSE 1 END AS "triple_test"
  59.     FROM find_triples
  60. )
  61. SELECT
  62.     SUM(triple_test) AS "triple_count"
  63. FROM tests
  64. ;
  65. -- Now return the count for each group
  66. WITH tests AS ( -- 1m 2s
  67.     SELECT
  68.         GROUP,
  69.         CASE
  70.             WHEN LEAD(RESULT) OVER (ORDER BY row_num) IS NULL   THEN 0
  71.             WHEN LAG(RESULT)  OVER (ORDER BY row_num) IS NULL   THEN 0
  72.             WHEN LEAD(RESULT) OVER (ORDER BY row_num) != RESULT THEN 0
  73.             WHEN LAG(RESULT)  OVER (ORDER BY row_num) != RESULT THEN 0
  74.             WHEN LEAD(GROUP)  OVER (ORDER BY row_num) != GROUP  THEN 0
  75.             WHEN LAG(GROUP)   OVER (ORDER BY row_num) != GROUP  THEN 0
  76.             ELSE 1 END AS "triple_test"
  77.     FROM find_triples
  78. )
  79. SELECT
  80.     GROUP,
  81.     SUM(triple_test) AS "triple_count"
  82. FROM tests
  83. GROUP BY GROUP
  84. ;
  85. DROP TABLE IF EXISTS temp_rand; -- 0.17s
  86. DROP TABLE IF EXISTS find_triples; -- 0.19s
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement