dreamworker

Untitled

Jun 24th, 2020
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // =============================================================================
  2. // DDL
  3. // ============================================================================
  4.  
  5. CREATE TABLE cinema.movie
  6. (
  7.     id bigint NOT NULL DEFAULT nextval('cinema.movie_id_seq'::regclass),
  8.     name character varying(255) COLLATE pg_catalog."default" NOT NULL,
  9.     duration integer NOT NULL,
  10.     CONSTRAINT movie_pkey PRIMARY KEY (id)
  11. )
  12.  
  13.  
  14.  
  15.  
  16. CREATE TABLE cinema.session
  17. (
  18.     id bigint NOT NULL DEFAULT nextval('cinema.session_id_seq'::regclass),
  19.     start timestamp without time zone NOT NULL,
  20.     price numeric(10,3) NOT NULL,
  21.     movie_id bigint,
  22.     CONSTRAINT session_pkey PRIMARY KEY (id),
  23.     CONSTRAINT fk_cinema_session_movie_id FOREIGN KEY (movie_id)
  24.         REFERENCES cinema.movie (id) MATCH SIMPLE
  25.         ON UPDATE NO ACTION
  26.         ON DELETE NO ACTION
  27. )
  28. CREATE INDEX id_cinema_session_movie_id
  29. ON cinema.session(movie_id)
  30.  
  31.  
  32.  
  33. CREATE TABLE cinema.ticket
  34. (
  35.     id bigint NOT NULL DEFAULT nextval('cinema.ticket_id_seq'::regclass),
  36.     session_id bigint,
  37.     CONSTRAINT ticket_pkey PRIMARY KEY (id),
  38.     CONSTRAINT fk_cinema_ticket_session_id FOREIGN KEY (session_id)
  39.         REFERENCES cinema.session (id) MATCH SIMPLE
  40.         ON UPDATE NO ACTION
  41.         ON DELETE NO ACTION
  42. )
  43.  
  44.  
  45. CREATE INDEX id_cinema_ticket_session_id
  46. ON cinema.ticket(session_id)
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53. // =============================================================================
  54. // ошибки в расписании
  55. // =============================================================================
  56.  
  57. WITH sessions_interval AS (
  58.     SELECT m.name, s.start,
  59.     s.start + (m.duration::text||'minute')::interval AS end,   
  60.     m.duration,
  61.     LEAD(start)  OVER (ORDER BY start) AS next_start,
  62.     LEAD(m.name) OVER (ORDER BY start) AS next_name,
  63.     -(LEAD(start)  OVER (ORDER BY start) - s.start - (m.duration::text||'minute')::interval)  AS overlap   
  64.     FROM session
  65.     LEFT JOIN movie m ON s.movie_id = m.id
  66. )
  67. SELECT *
  68. FROM sessions_interval
  69. WHERE overlap > interval '0 minute'
  70.  
  71.  
  72. // =============================================================================
  73. // перерывы 30 минут и более между фильмами
  74. // =============================================================================
  75.  
  76. WITH sessions_interval AS (
  77.     SELECT m.name, s.start,
  78.     s.start + (m.duration::text||'minute')::interval AS end,   
  79.     m.duration,
  80.     LEAD(start) OVER (ORDER BY start) AS next_start,
  81.     LEAD(start) OVER (ORDER BY start) - s.start - (m.duration::text||'minute')::interval  AS break,
  82.     LEAD(m.name)OVER (ORDER BY start) AS next_name
  83.     FROM session
  84.     LEFT JOIN movie m ON s.movie_id = m.id
  85. )
  86. SELECT *
  87. FROM sessions_interval
  88. WHERE break > interval '30 minute'
  89. ORDER BY break DESC
  90.  
  91.  
  92.  
  93.  
  94.  
  95. // =============================================================================
  96. // данные фильму / по всем фильмам
  97. // =============================================================================
  98. (SELECT
  99. m.name AS movie,
  100. SUM(s.price) AS income,
  101. COUNT(t.id) AS users_total,
  102. ROUND(AVG(t.id)::numeric,1)
  103. FROM session s
  104. JOIN movie m ON s.movie_id = m.id
  105. JOIN ticket t ON t.session_id = s.id
  106. GROUP BY movie
  107. ORDER BY income DESC)
  108.  
  109. UNION ALL SELECT  
  110. 'ВСЕГО' AS movie,
  111. SUM(s.price) AS income,
  112. COUNT(t.id) AS users_total,
  113. ROUND(AVG(t.id)::numeric,1)
  114. FROM session s
  115.  
  116. JOIN movie m ON s.movie_id = m.id
  117. JOIN ticket t ON t.session_id = s.id
  118. GROUP BY movie
Advertisement
Add Comment
Please, Sign In to add comment