Advertisement
xolcman

trainer

Nov 24th, 2022 (edited)
560
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.28 KB | None | 0 0
  1. WITH rnd_book AS (
  2. SELECT id, par_median FROM book
  3. WHERE genre = 'classic' AND lang = 'ru'
  4. ORDER BY RANDOM() LIMIT 1
  5. ),
  6. grouped AS (
  7. SELECT ROW_NUMBER() OVER (ORDER BY book, num) / (1600 / b.par_median) group_id,
  8. p.id, p.book, p.num, p.length
  9. FROM paragraph p
  10. RIGHT JOIN rnd_book b ON b.id = p.book
  11. ),
  12. comb_list AS (
  13. SELECT id FROM comb
  14. WHERE comb LIKE ANY (array['кло', 'спр', 'кил', 'фу_'])
  15. ),
  16. comb_max AS (
  17. SELECT pi.comb, MAX(count) cnt
  18. FROM par_inx pi
  19. RIGHT JOIN comb_list ON comb_list.id = pi.comb
  20. RIGHT JOIN grouped g ON g.id = pi.paragraph
  21. GROUP BY pi.comb
  22. ),
  23. found AS (
  24. SELECT pi.paragraph,
  25. SUM(pi.COUNT / cm.cnt::FLOAT) score
  26. FROM par_inx pi
  27. RIGHT JOIN comb_max cm ON pi.comb = cm.comb
  28. RIGHT JOIN grouped g ON g.id = pi.paragraph
  29. GROUP BY paragraph
  30. ),
  31. found_groups AS (
  32. SELECT group_id, id, book, num, length, f.score,
  33. SUM(score) OVER (PARTITION BY group_id) score_total,
  34. SUM(LENGTH) OVER (PARTITION BY group_id
  35. ORDER BY score
  36. ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) len_acc
  37. FROM grouped g
  38. LEFT JOIN found f ON g.id = f.paragraph
  39. ),
  40. filtered AS (
  41. SELECT group_id
  42. FROM found_groups
  43. WHERE score_total IS NOT NULL AND len_acc > 550 AND len_acc < 650
  44. )
  45. SELECT * FROM found_groups
  46. WHERE group_id IN (SELECT group_id FROM filtered);
  47.  
  48.  
  49.  
  50.  
  51. WITH comb_id AS (
  52. SELECT id FROM comb
  53. WHERE comb IN ('авш', 'при', 'ско')
  54. ),
  55. par_id AS (
  56. SELECT id FROM paragraph
  57. WHERE book IN (
  58. SELECT id FROM book WHERE genre = 'prose' AND lang = 'ru'
  59. )),
  60. comb_max AS (
  61. SELECT comb, MAX(count) cnt
  62. FROM par_inx
  63. WHERE comb IN (SELECT id FROM comb_id) AND
  64. paragraph IN (SELECT id FROM par_id)
  65. GROUP BY comb
  66. ),
  67. grouped AS (
  68. SELECT ROW_NUMBER() OVER (ORDER BY book, num) / 4 group_id,
  69. id, book, num, length
  70. FROM paragraph
  71. WHERE id IN (SELECT id FROM par_id)
  72. ),
  73. found AS (
  74. SELECT pi.paragraph,
  75. SUM(pi.COUNT / cm.cnt::FLOAT) score
  76. FROM par_inx pi
  77. LEFT JOIN paragraph p ON pi.paragraph = p.id
  78. LEFT JOIN comb_max cm ON pi.comb = cm.comb
  79. WHERE paragraph IN (SELECT id FROM par_id) AND pi.comb IN (SELECT id FROM comb_id)
  80. GROUP BY paragraph
  81. ),
  82. found_groups AS (
  83. SELECT group_id, id, book, num, length, f.score,
  84. SUM(score) OVER (PARTITION BY group_id) score_total,
  85. SUM(length) OVER (PARTITION BY group_id
  86. ORDER BY score
  87. ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) len_acc
  88. FROM grouped g
  89. LEFT JOIN found f ON g.id = f.paragraph
  90. )
  91. SELECT * FROM found_groups
  92. WHERE group_id IN (SELECT group_id
  93. FROM found_groups
  94. WHERE score_total IS NOT NULL AND len_acc > 550 AND len_acc < 650);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement