-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathB16_DA1.sql
152 lines (138 loc) · 3.2 KB
/
B16_DA1.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
--ex1
WITH
organize AS (
SELECT
customer_id,
delivery_id,
order_date,
customer_pref_delivery_date,
CASE
WHEN order_date = customer_pref_delivery_date THEN 'immediate'
ELSE 'scheduled'
END AS schedule,
ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY order_date ASC) AS rn
FROM Delivery
ORDER BY customer_id
),
firstorder AS (
SELECT
customer_id,
delivery_id,
order_date,
schedule
FROM organize
WHERE rn = 1
)
SELECT
ROUND((SUM(CASE WHEN schedule = 'immediate' THEN 1 ELSE 0 END) * 100.0) / COUNT(*), 2) AS immediate_percentage
FROM firstorder;
--ex2
with cte as(
select player_id as player_id_1,
event_date as cur,
lead(event_date,1) over(PARTITION BY player_id ORDER BY event_date) as 'next',
FIRST_VALUE(event_date) over(PARTITION BY player_id ORDER BY event_date) as 'fir'
from Activity
)
select round(count(distinct player_id_1)
/(select count(distinct player_id) from Activity),2) as fraction
from cte
where cur + interval 1 day=next and cur=fir;
--ex3
SELECT
CASE
WHEN id = (SELECT MAX(id) FROM seat) AND id % 2 = 1
THEN id
WHEN id % 2 = 1
THEN id + 1
ELSE id - 1
END AS id,
student
FROM seat
ORDER BY id
--ex4
WITH cte1 as
(SELECT
visited_on,
SUM(amount) as total_amount
FROM Customer
GROUP BY visited_on),
cte2 as
(SELECT
visited_on,
SUM(total_amount) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as amount,
ROUND(AVG(total_amount) OVER(ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW),2) as average_amount
FROM cte1)
SELECT *
FROM cte2
WHERE visited_on >= (SELECT visited_on FROM Customer ORDER BY visited_on LIMIT 1) + 6
ORDER BY visited_on
--ex5
WITH TIV_2015_Duplicates AS (
SELECT tiv_2015
FROM Insurance
GROUP BY tiv_2015
HAVING COUNT(DISTINCT pid) > 1
),
Unique_Locations AS (
SELECT lat, lon
FROM Insurance
GROUP BY lat, lon
HAVING COUNT(pid) = 1
)
SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016
FROM Insurance
WHERE tiv_2015 IN (SELECT tiv_2015 FROM TIV_2015_Duplicates)
AND (lat, lon) IN (SELECT lat, lon FROM Unique_Locations);
--ex6
WITH ranking as (
SELECT
d.name AS Department,
e.name AS Employee,
e.salary,
DENSE_RANK() OVER (PARTITION BY d.name ORDER BY e.salary DESC) AS SalaryRank
FROM
employee AS e
JOIN
department AS d ON e.departmentId = d.id)
select
Department,
Employee,
salary
from ranking
where SalaryRank <= 3
--ex7
with sum as(
SELECT
person_name,
SUM(weight) OVER(ORDER BY turn) AS total
FROM Queue)
select person_name
from sum
where total <=1000
order by total desc
limit 1
--ex8
WITH UniqueProducts AS (
SELECT DISTINCT product_id
FROM Products
),
LastChangedPrice AS (
SELECT DISTINCT
product_id,
FIRST_VALUE(new_price) OVER (
PARTITION BY product_id
ORDER BY change_date DESC
) AS price
FROM Products
WHERE change_date <= '2019-08-16'
)
SELECT
UP.product_id,
CASE WHEN LCP.price IS NULL THEN 10 ELSE LCP.price END AS price
FROM
UniqueProducts UP
LEFT JOIN
LastChangedPrice LCP
ON
UP.product_id = LCP.product_id;