Advertisement
dtorkin

Практика 1 (Базы Данных)

Mar 7th, 2023 (edited)
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- 1 ЧАСТЬ_______________________________________________________________________________________
  2. -- 1 пункт
  3. SELECT NAME, quality1, quality2,
  4. CASE
  5. WHEN quality1 = 'evil' AND quality2 = 'cunning' THEN 'Slytherin'
  6. WHEN quality1 = 'brave' AND quality2 != 'evil' THEN 'Gryffindor'
  7. WHEN quality1 = 'studious' OR quality2 = 'intelligent' THEN 'Ravenclaw'
  8. WHEN quality1 = 'hufflepuff' OR quality2 = 'hufflepuff' THEN 'Hufflepuff'
  9. ELSE 'no suitable.'
  10. END AS Houses
  11. FROM students;
  12.  
  13. -- 2 пункт
  14. CREATE TABLE hogwarts_students (id serial, NAME TEXT, quality1 TEXT, quality2 TEXT, houses TEXT, points INT);
  15.  
  16. INSERT INTO hogwarts_students SELECT *,
  17. CASE
  18. WHEN quality1 = 'evil' AND quality2 = 'cunning' THEN 'Slytherin'
  19. WHEN quality1 = 'brave' AND quality2 != 'evil' THEN 'Gryffindor'
  20. WHEN quality1 = 'studious' OR quality2 = 'intelligent' THEN 'Ravenclaw'
  21. WHEN quality1 = 'hufflepuff' OR quality2 = 'hufflepuff' THEN 'Hufflepuff'
  22. ELSE 'no suitable.'
  23. END AS Houses, '0'
  24. FROM students;
  25.  
  26. DELETE FROM hogwarts_students WHERE houses = 'no suitable.';
  27.  
  28. SELECT * FROM hogwarts_students;
  29.  
  30. -- 3 пункт
  31. CREATE VIEW ravenclaw_students AS
  32. SELECT *
  33. FROM Hogwarts_students
  34. WHERE houses = 'Ravenclaw';
  35.  
  36. SELECT * FROM ravenclaw_students;
  37.  
  38. -- 4 пункт
  39. CREATE MATERIALIZED VIEW mymatview AS
  40. SELECT houses, SUM(points) from hogwarts_students GROUP BY houses;
  41.  
  42. SELECT * FROM mymatview;
  43.  
  44. -- 5 пункт
  45. UPDATE ravenclaw_students SET points = 15 WHERE id = 31;
  46. UPDATE ravenclaw_students SET points = 10 WHERE id = 48;
  47. UPDATE ravenclaw_students SET points = 5 WHERE id = 57;
  48. UPDATE ravenclaw_students SET points = 12 WHERE id = 75;
  49. /*
  50. Не получится изменить оценки другого факультета, так как
  51. в этом представлении только студенты Когтеврана
  52. */
  53. SELECT * from ravenclaw_students;
  54.  
  55. -- 6 пункт
  56. REFRESH MATERIALIZED VIEW mymatview;
  57. SELECT * FROM mymatview;
  58.  
  59. -- 7 пункт
  60. CREATE TABLE grade_by_subject (id serial, subject text, grade int[]);
  61.  
  62. INSERT INTO grade_by_subject SELECT id FROM hogwarts_students;
  63.  
  64. UPDATE grade_by_subject SET subject = 'Arithmancy' WHERE id <= 33;
  65. UPDATE grade_by_subject SET subject = 'Muggle Studies' WHERE id > 33 AND id <= 66;
  66. UPDATE grade_by_subject SET subject = 'Defence Against the Dark Arts' WHERE id > 66 AND id <= 99;
  67.  
  68. -- 7 (1) пункт
  69. UPDATE grade_by_subject SET grade = '{4, 4, 3, 5}' WHERE id = 1;
  70. UPDATE grade_by_subject SET grade = '{5, 2}' WHERE id = 31;
  71. UPDATE grade_by_subject SET grade = '{3, 3, 2}' WHERE id = 8;
  72.  
  73. -- 7 (2) пункт
  74. UPDATE grade_by_subject SET grade[4] = 2 WHERE id = 8;
  75.  
  76. -- 7 (3) пункт
  77. SELECT * FROM grade_by_subject WHERE 2 = ANY (grade);
  78.  
  79. -- 7 (4) пункт
  80. SELECT * FROM grade_by_subject;
  81.  
  82. WITH unnested AS (
  83. SELECT id as student_id, unnest(grade) as score
  84. FROM grade_by_subject
  85. )
  86. SELECT id, subject, avg(score)
  87. FROM grade_by_subject
  88. INNER JOIN unnested
  89. ON student_id=id
  90. GROUP BY 1, 2
  91. ORDER BY 1;
  92.  
  93. -- 2 ЧАСТЬ_______________________________________________________________________________________
  94. -- 1 задание:
  95. WITH banned_id AS (
  96.     SELECT *
  97.     FROM user_data
  98.     WHERE banned = 'yes'
  99. )
  100. SELECT id, client_id, driver_id, city_id, status, request_at FROM trip
  101. JOIN banned_id ON banned_id.user_id = trip.client_id
  102. WHERE banned_id.user_id=trip.client_id;
  103.  
  104. -- 2 задание:
  105. WITH stats AS (
  106.     SELECT request_at,
  107.     COUNT(id) AS total
  108.     FROM trip
  109.     group by request_at
  110. ),
  111.     cancel AS (
  112.     SELECT request_at,
  113.     COUNT(id) AS cancelled
  114.     FROM trip
  115.     WHERE status LIKE 'cancelled%'
  116.     GROUP BY request_at
  117. )
  118. SELECT stats.request_at, total, cancelled, cancelled*100/total as rate FROM cancel
  119. JOIN stats ON stats.request_at = cancel.request_at;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement