Guest User

Untitled

a guest
Dec 12th, 2017
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.52 KB | None | 0 0
  1. # Rideshare Scenario - PostgreSQL
  2.  
  3. After doing a case study, I got inspired to continue building up the data model and create more queries to investigate
  4. the made-up dataset.
  5.  
  6. ***You will find some modified questions asked and other customized questions I made to help on making the queries.***
  7.  
  8.  
  9. ## Query Examples
  10.  
  11. - Show bill transactions with no payments
  12.  
  13. ```
  14. SELECT * FROM bill_details bd
  15. WHERE bd.id NOT IN (SELECT DISTINCT bill_id FROM payment_details);
  16.  
  17. 100002,'jose1','2016-06-07 22:00:21.996182',251,'1'
  18. 100007,'thomas89','2016-06-07 22:00:21.996182',615,'1'
  19. 100009,'john3','2016-06-07 22:00:21.996182',700,'1'
  20. 100011,'jose1','2017-06-07 22:00:21.996182',251,'1'
  21. 100016,'thomas89','2017-06-07 22:00:21.996182',615,'1'
  22. 100018,'john3','2017-06-07 22:00:21.996182',700,'0'
  23. 100019,'john3','2017-06-07 22:00:21.996182',350,'0'
  24. 100020,'john3','2017-06-07 22:00:21.996182',700,'0'
  25. 100021,'stev33','2016-06-07 22:00:21.996182',1001,'0'
  26. 100022,'stev33','2016-06-07 22:00:21.996182',1201,'0'
  27. ```
  28.  
  29. - Show bill transactions fro bills made in June 2016 for less than 500
  30.  
  31. ```
  32. SELECT * FROM bill_details
  33. WHERE EXTRACT(YEAR FROM created_at) = 2016
  34. AND EXTRACT(MONTH FROM created_at) = 06 AND amount < 500;
  35.  
  36. 100001,'jose1','2016-06-07 22:00:21.996182',251,'0'
  37. 100002,'jose1','2016-06-07 22:00:21.996182',251,'1'
  38. 100005,'samuel33','2016-06-07 22:00:21.996182',251,'0'
  39. 100006,'raul889','2016-06-07 22:00:21.996182',301,'0'
  40. ```
  41.  
  42.  
  43. - Show bill and payment details including days w/o payments and
  44.  
  45. ```
  46. SELECT
  47. bd.id, bd.partner_id, bd.amount AS bill_amount, bd.created_at::DATE AS bill_date, bd.error_code AS bill_error,
  48. py.amount AS payment_amount, py.created_at::DATE AS payment_date, (py.created_at - bd.created_at) AS payment_lag,
  49. CASE WHEN py.amount IS NULL THEN 'not paid' ELSE 'paid' END AS Status
  50. FROM bill_details bd LEFT JOIN payment_details py ON bd.id = py.bill_id;
  51.  
  52. 100001,'jose1',251,'2016-06-07','0','300.10','2016-06-14','7 days','paid'
  53. 100003,'jane22',451,'2016-12-07','0','410.10','2017-06-14','189 days','paid'
  54. 100004,'stev33',651,'2016-06-07','0','500.10','2016-06-14','7 days','paid'
  55. 100005,'samuel33',251,'2016-06-07','0','255.6','2016-06-14','7 days','paid'
  56. 100006,'raul889',301,'2016-06-07','0','220.5','2016-12-14','190 days','paid'
  57. 100010,'jose1',251,'2017-06-07','0','350.10','2017-06-14','7 days','paid'
  58. 100012,'jane22',451,'2017-12-07','0','410.10','2017-06-14','-176 days','paid'
  59. 100013,'stev33',651,'2017-06-07','0','500.10','2017-06-14','7 days','paid'
  60. 100014,'samuel33',251,'2017-06-07','0','255.6','2017-06-14','7 days','paid'
  61. 100015,'raul889',301,'2017-06-07','0','700.25','2017-12-14','190 days','paid'
  62. 100017,'john3',700,'2017-06-07','0','700.00','2017-12-07','183 days','paid'
  63. 100002,'jose1',251,'2016-06-07','1',,,,'not paid'
  64. 100022,'stev33',1201,'2016-06-07','0',,,,'not paid'
  65. 100018,'john3',700,'2017-06-07','0',,,,'not paid'
  66. 100021,'stev33',1001,'2016-06-07','0',,,,'not paid'
  67. 100020,'john3',700,'2017-06-07','0',,,,'not paid'
  68. 100007,'thomas89',615,'2016-06-07','1',,,,'not paid'
  69. 100016,'thomas89',615,'2017-06-07','1',,,,'not paid'
  70. 100019,'john3',350,'2017-06-07','0',,,,'not paid'
  71. 100011,'jose1',251,'2017-06-07','1',,,,'not paid'
  72. 100009,'john3',700,'2016-06-07','1',,,,'not paid'
  73. ```
  74.  
  75.  
  76. - Create temporary table with important bill and payment details
  77.  
  78. ```
  79. CREATE TEMP TABLE bill_payment AS
  80. SELECT
  81. bd.id, bd.partner_id, bd.amount AS bill_amount, bd.created_at::date AS bill_date, bd.error_code AS bill_error,
  82. py.amount AS payment_amount, py.created_at::date AS payment_date, (py.created_at::date - bd.created_at::date) AS payment_lag,
  83. CASE WHEN py.amount IS NULL THEN (current_date - bd.created_at::date) END AS no_pay_since,
  84. (bd.amount - CASE WHEN py.amount IS NULL THEN 0 ELSE py.amount END) AS balance,
  85. CASE WHEN py.amount IS NULL THEN 'not paid' ELSE 'paid' END AS status
  86. FROM bill_details bd LEFT JOIN payment_details py ON bd.id = py.bill_id; --DROP TABLE bill_payment
  87.  
  88. SELECT 21
  89. Query returned successfully in 103 msec.
  90. ```
  91.  
  92.  
  93. - Using temporary table, show paid vs no paid details and group the details
  94.  
  95. ```
  96. SELECT status, bill_error, SUM(bill_amount) AS billed_total, SUM(payment_amount) AS payment_total, SUM(balance) AS balance_total
  97. FROM bill_payment
  98. GROUP BY status, bill_error
  99. ORDER BY SUM(payment_amount);
  100.  
  101. 'paid','0','4510','4602.55','-92.55'
  102. 'not paid','0','3952',,'3952'
  103. 'not paid','1','2432',,'2432'
  104. ```
  105.  
  106.  
  107. - Using temporary table, provide statistics grouped by banks
  108.  
  109. ```
  110. SELECT
  111. pb.id, pb.bank_name, SUM(bill_amount) AS billed_total, SUM(payment_amount) AS paid_total,
  112. COUNT(bill_amount) AS billed_count, COUNT(payment_amount) AS paid_count, SUM(balance) AS balance,
  113. ROUND(AVG(payment_lag), 2) AS payment_lag_avg, ROUND(stddev_pop(payment_lag), 2) pay_lag_std,
  114. MAX(payment_lag) AS pay_lag_max, MIN(payment_lag) AS pay_lag_min,
  115. ROUND(AVG(no_pay_since), 2) AS no_pay_since_avg, ROUND(stddev_pop(no_pay_since), 2) no_pay_since_std,
  116. MAX(no_pay_since) AS no_pay_since_max, MIN(no_pay_since) AS no_pay_since_min
  117. FROM bill_payment bp
  118. LEFT JOIN driver_details dd ON bp.partner_id = dd.partner_id
  119. LEFT JOIN partner_bankinfo pb ON dd.bank_id = pb.id
  120. GROUP BY pb.id, pb.bank_name;
  121.  
  122. 'bancomer-mexico','Bancomer','7884','1700.20','11','3','6183.80','65.67','82.97',183,7,'367.50','182.50',550,185
  123. 'citi-usa','Citi Bank','902','820.20','2','2','81.80','6.50','182.50',189,-176,,,,
  124. 'bri-indonesia','Bank Rakyat','2108','2082.15','8','6','25.85','68.00','86.27',190,7,'367.50','182.50',550,185
  125. ```
  126.  
  127.  
  128. - Using a with clause, validate why no_pay_since_averages are the same for Bank Rakyat and Bancomer
  129. ```
  130. WITH no_pay_since_valid AS (
  131. SELECT bp.id, no_pay_since, bank_name
  132. FROM bill_payment bp
  133. LEFT JOIN driver_details dd ON bp.partner_id = dd.partner_id
  134. LEFT JOIN partner_bankinfo pb ON dd.bank_id = pb.id
  135. WHERE (pb.bank_name = 'Bank Rakyat' OR pb.bank_name = 'Bancomer') AND no_pay_since IS NOT NULL
  136. )
  137. SELECT
  138. svout.bank_name, svout.no_pay_since, COUNT(svout.no_pay_since),
  139. (SELECT SUM(svin.no_pay_since) FROM no_pay_since_valid svin
  140. WHERE svout.bank_name = svin.bank_name
  141. ) AS sub_total,
  142. ROUND((SELECT SUM(svin.no_pay_since) FROM no_pay_since_valid svin
  143. WHERE svout.bank_name = svin.bank_name)/
  144. (SELECT COUNT(svin.no_pay_since)::DECIMAL FROM no_pay_since_valid svin
  145. WHERE svout.bank_name = svin.bank_name), 2
  146. ) AS sub_average
  147. FROM no_pay_since_valid svout
  148. GROUP BY bank_name, no_pay_since;
  149.  
  150. 'Bancomer',185,'4','2940','367.50'
  151. 'Bancomer',550,'4','2940','367.50'
  152. 'Bank Rakyat',550,'1','735','367.50'
  153. 'Bank Rakyat',185,'1','735','367.50'
  154. ```
  155.  
  156.  
  157. - Find the transaction with transaction date errors
  158. ```
  159. SELECT *
  160. FROM (
  161. SELECT
  162. bd.id, bd.partner_id, bd.amount AS bill_amount, bd.created_at AS bill_date, bd.error_code AS bill_error,
  163. py.amount AS payment_amount, py.created_at AS payment_date, (py.created_at - bd.created_at) AS payment_lag
  164. FROM bill_details bd LEFT JOIN payment_details py ON bd.id = py.bill_id
  165. ) foo
  166. WHERE payment_lag < '0';
  167.  
  168. 100012,'jane22',451,'2017-12-07 22:00:21.996182','0','410.10','2017-06-14 22:00:21.996182','-176 days'
  169. ```
  170.  
  171.  
  172. - Show how many partners received payments in banks of Jakarta
  173. ```
  174. SELECT
  175. COUNT(DISTINCT dd.partner_id) AS number_partners
  176. FROM driver_details dd
  177. LEFT JOIN bill_details bd ON dd.partner_id = bd.partner_id
  178. LEFT JOIN payment_details pd ON bd.id = pd.bill_id
  179. LEFT JOIN partner_bankinfo pb ON dd.bank_id = pb.id
  180. LEFT JOIN city_details cd ON cd.id = pb.bank_city_id
  181. WHERE pd.error_code = '0' AND cd.city_name = 'Jakarta'
  182. AND EXTRACT(WEEK FROM dd.last_trip) < (EXTRACT(WEEK FROM NOW()) - 2);
  183.  
  184. '2'
  185. ```
  186.  
  187.  
  188. - Top 2 average payments by partners
  189. ```
  190. SELECT
  191. dd.partner_id, dd.first_name || ' ' || dd.last_name AS partner_name, ROUND(AVG(bd.amount), 2) AS avg_bill,
  192. COUNT(bd.amount) AS number_bills, MAX(bd.created_at)::date AS last_bill
  193. FROM driver_details dd
  194. LEFT JOIN bill_details bd ON dd.partner_id = bd.partner_id
  195. LEFT JOIN partner_bankinfo pb ON pb.id = dd.bank_id
  196. LEFT JOIN city_details cd ON cd.id = pb.bank_city_id
  197. WHERE cd.currency_code = 'MXN' AND EXTRACT(YEAR FROM bd.created_at) = 2016
  198. GROUP BY dd.partner_id
  199. HAVING AVG(amount) IS NOT NULL --nulls should be investigated
  200. ORDER BY AVG(amount) DESC
  201. LIMIT 2;
  202.  
  203. 'stev33','Steven Lamas','951.00','3','2016-06-07'
  204. 'john3','John Travolta','700.00','1','2016-06-07'
  205. ```
  206.  
  207. ## Creating Database and Tables - PostgreSQL
  208.  
  209. ```
  210. CREATE TABLE city_details( -- DROP TABLE city_details CASCADE
  211. id INTEGER PRIMARY KEY,
  212. city_name VARCHAR(20),
  213. country_id INTEGER UNIQUE,
  214. country_name VARCHAR(20),
  215. currency_code VARCHAR(20)
  216. );
  217.  
  218. CREATE TABLE driver_details( -- DROP TABLE driver_details CASCADE
  219. partner_id VARCHAR(20) PRIMARY KEY,
  220. first_name VARCHAR(20),
  221. last_name VARCHAR(20),
  222. last_trip TIMESTAMP,
  223. bank_account INTEGER
  224. );
  225.  
  226. CREATE TABLE partner_bankinfo( -- DROP TABLE partner_bankinfo CASCADE
  227. id VARCHAR(20) PRIMARY KEY,
  228. bank_routing INTEGER,
  229. bank_city_id INTEGER REFERENCES city_details(id),
  230. bank_name VARCHAR(20)
  231. );
  232.  
  233. --forgot to add the relation to the bank_id
  234. ALTER TABLE driver_details
  235. ADD COLUMN bank_id VARCHAR(20) REFERENCES partner_bankinfo(id);
  236.  
  237. CREATE TABLE bill_details( --DROP TABLE bill_details CASCADE
  238. id INTEGER PRIMARY KEY,
  239. partner_id VARCHAR(20) REFERENCES driver_details(partner_id),
  240. created_at TIMESTAMP,
  241. amount INTEGER,
  242. error_code VARCHAR(20)
  243. );
  244.  
  245. CREATE TABLE payment_details( -- DROP TABLE payment_details
  246. id INTEGER PRIMARY KEY,
  247. bill_id INTEGER REFERENCES bill_details(id),
  248. partner_id VARCHAR(20) REFERENCES driver_details(partner_id),
  249. created_at TIMESTAMP,
  250. amount DECIMAL,
  251. error_code VARCHAR(20)
  252. );
  253. ```
  254.  
  255.  
  256. ## Inserting Made-up Dataset
  257.  
  258. ```
  259. INSERT INTO city_details
  260. VALUES
  261. (10, 'Jakarta', 1, 'Indonesia', 'IDR'),
  262. (20, 'California', 2, 'United States', 'USD'),
  263. (30, 'Cozumel', 3, 'Mexico', 'MXN');
  264.  
  265. INSERT INTO partner_bankinfo
  266. VALUES
  267. ('bri-indonesia', 3054654, 10, 'Bank Rakyat' ),
  268. ('citi-usa', 3054653, 20, 'Citi Bank'),
  269. ('bancomer-mexico', 3054634, 30, 'Bancomer');
  270.  
  271. INSERT INTO driver_details
  272. VALUES
  273. ('jose1', 'Jose', 'Ortiz', '2017-11-07 22:21:16.261347-08', 6514651, 'bri-indonesia'),
  274. ('jane22', 'Jane', 'Smith', now(), 6541654, 'citi-usa'),
  275. ('stev33', 'Steven', 'Lamas', now(), 654654, 'bancomer-mexico'),
  276. ('raul889', 'Raul', 'Martinez', '2017-11-07 22:21:16.261347-08', 5465468, 'bri-indonesia'),
  277. ('samuel33', 'Samuel', 'Rodriguez', '2017-11-07 22:21:16.261347-08', 654651, 'bri-indonesia'),
  278. ('thomas89', 'Thomas', 'Tom', now(), 981651, 'bancomer-mexico'),
  279. ('john3', 'John', 'Travolta', '2017-11-07 22:21:16.261347-08', 6516216, 'bancomer-mexico'),
  280. ('henryindy', 'Henry', 'Jones', '2017-11-07 22:21:16.261347-08', 6551556, 'citi-usa'),
  281. ('juan34', 'Juan', 'Velasquez', '2017-11-07 22:21:16.261347-08', 6546546, 'bri-indonesia'),
  282. ('arturo3', 'Arturo', 'Pena', '2017-11-07 22:21:16.261347-08', 651651, 'bri-indonesia'),
  283. ('tiemma3', 'Tiemma', 'Williams', now(), 6516516, 'bancomer-mexico');
  284.  
  285. INSERT INTO bill_details
  286. VALUES
  287. (100001, 'jose1', '2016-06-07 22:00:21.996182', 250.5, 0),
  288. (100002, 'jose1', '2016-06-07 22:00:21.996182', 250.5, 1),
  289. (100003, 'jane22', '2016-12-07 22:00:21.996182', 450.5, 0),
  290. (100004, 'stev33', '2016-06-07 22:00:21.996182', 650.5, 0),
  291. (100005, 'samuel33', '2016-06-07 22:00:21.996182', 250.5, 0),
  292. (100006, 'raul889', '2016-06-07 22:00:21.996182', 301.20, 0),
  293. (100007, 'thomas89', '2016-06-07 22:00:21.996182', 615.15, 1),
  294. (100009, 'john3', '2016-06-07 22:00:21.996182', 700.00, 1),
  295. (100010, 'jose1', '2017-06-07 22:00:21.996182', 250.5, 0),
  296. (100011, 'jose1', '2017-06-07 22:00:21.996182', 250.5, 1),
  297. (100012, 'jane22', '2017-12-07 22:00:21.996182', 450.5, 0),
  298. (100013, 'stev33', '2017-06-07 22:00:21.996182', 650.5, 0),
  299. (100014, 'samuel33', '2017-06-07 22:00:21.996182', 250.5, 0),
  300. (100015, 'raul889', '2017-06-07 22:00:21.996182', 301.20, 0),
  301. (100016, 'thomas89', '2017-06-07 22:00:21.996182', 615.15, 1),
  302. (100017, 'john3', '2017-06-07 22:00:21.996182', 700.00, 0);
  303.  
  304. INSERT INTO bill_details
  305. VALUES
  306. (100018, 'john3', '2017-06-07 22:00:21.996182', 700.00, 0),
  307. (100019, 'john3', '2017-06-07 22:00:21.996182', 350.11, 0),
  308. (100020, 'john3', '2017-06-07 22:00:21.996182', 700.00, 0),
  309. (100021, 'stev33', '2016-06-07 22:00:21.996182', 1000.5, 0),
  310. (100022, 'stev33', '2016-06-07 22:00:21.996182', 1200.5, 0);
  311.  
  312. INSERT INTO payment_details
  313. VALUES
  314. (654654, 100001, 'jose1', '2016-06-14 22:00:21.996182', 300.10, 0),
  315. (465654, 100003, 'jane22', '2017-06-014 22:00:21.996182', 410.10, 0),
  316. (845161, 100004, 'stev33', '2016-06-14 22:00:21.996182', 500.10, 0),
  317. (644651, 100005, 'samuel33', '2016-06-14 22:00:21.996182', 255.6, 1),
  318. (654156, 100006, 'raul889', '2016-12-14 22:00:21.996182', 220.5, 0),
  319. (655854, 100010, 'jose1', '2017-06-14 22:00:21.996182', 350.10, 0),
  320. (465974, 100012, 'jane22', '2017-06-014 22:00:21.996182', 410.10, 0),
  321. (846461, 100013, 'stev33', '2017-06-14 22:00:21.996182', 500.10, 0),
  322. (874651, 100014, 'samuel33', '2017-06-14 22:00:21.996182', 255.6, 1),
  323. (696156, 100015, 'raul889', '2017-12-14 22:00:21.996182', 700.25, 0);
  324.  
  325. INSERT INTO payment_details
  326. VALUES
  327. (651651, 100017, 'john3', '2017-12-07 22:00:21.996182', 700.00, 0);
  328. ```
Add Comment
Please, Sign In to add comment