-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathExchangeSeats.sql
105 lines (94 loc) · 2.44 KB
/
ExchangeSeats.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
-- Table: Seat
-- +-------------+---------+
-- | Column Name | Type |
-- +-------------+---------+
-- | id | int |
-- | student | varchar |
-- +-------------+---------+
-- id is the primary key (unique value) column for this table.
-- Each row of this table indicates the name and the ID of a student.
-- id is a continuous increment.
-- Write a solution to swap the seat id of every two consecutive students. If the number of students is odd, the id of the last student is not swapped.
-- Return the result table ordered by id in ascending order.
-- The result format is in the following example.
-- Example 1:
-- Input:
-- Seat table:
-- +----+---------+
-- | id | student |
-- +----+---------+
-- | 1 | Abbot |
-- | 2 | Doris |
-- | 3 | Emerson |
-- | 4 | Green |
-- | 5 | Jeames |
-- +----+---------+
-- Output:
-- +----+---------+
-- | id | student |
-- +----+---------+
-- | 1 | Doris |
-- | 2 | Abbot |
-- | 3 | Green |
-- | 4 | Emerson |
-- | 5 | Jeames |
-- +----+---------+
-- Explanation:
-- Note that if the number of students is odd, there is no need to change the last one's seat.
-- Solution
-- Write your PostgreSQL query statement below
with consecutive_students as
(
select S1.id S1id,
S2.id S2id,
S1.student S1student,
S2.student S2student
from Seat S1 cross join Seat S2
where S2.id - S1.id = 1
),
non_overlapping_students as
(
select tbl.S1student,
tbl.S2student
from
(
select S1id,
S2id,
S1student,
S2student,
row_number() over () as row_number
from consecutive_students
) tbl
where MOD(tbl.row_number,2) != 0
),
swap_seats as
(
select row_number() over () as row_number, student from
(
select UNNEST(STRING_TO_ARRAY(students, ',')) as student from
(
select S2student || ',' || S1student as students
from non_overlapping_students
)
)
),
last_seat as
(
select id as row_number,student from Seat
where id = (select max(id) from Seat)
)
select id,student from
(
select row_number as id,
student,
dense_rank() over (
partition by student
order by row_number
) as rank
from
(
select row_number,student from swap_seats
UNION ALL
select row_number,student from last_seat
)
) where rank=1 order by id