q13.sql 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. \set country '\'India\''
  2. \set endDate '\'2012-11-09\''::timestamp
  3. -- materialize=> \i q13.sql
  4. -- zombie.id | zombielikecount | totallikecount | zombiescore
  5. -- ----------------+-----------------+----------------+----------------------
  6. -- 4398046515583 | 1 | 28 | 0.03571428571428571
  7. -- 15393162797343 | 1 | 32 | 0.03125
  8. -- 6597069766996 | 1 | 59 | 0.01694915254237288
  9. -- 28587302331214 | 1 | 70 | 0.014285714285714285
  10. -- 13194139540014 | 4 | 349 | 0.011461318051575931
  11. -- 6597069773020 | 1 | 209 | 0.004784688995215311
  12. -- 1032 | 0 | 0 | 0
  13. -- 2238 | 0 | 0 | 0
  14. -- 3302 | 0 | 1 | 0
  15. -- 6353 | 0 | 0 | 0
  16. -- 9542 | 0 | 10 | 0
  17. -- 2199023255606 | 0 | 0 | 0
  18. -- 2199023257681 | 0 | 2 | 0
  19. -- 2199023259422 | 0 | 1 | 0
  20. -- 2199023260507 | 0 | 0 | 0
  21. -- 2199023260849 | 0 | 0 | 0
  22. -- 2199023261845 | 0 | 30 | 0
  23. -- 2199023263793 | 0 | 0 | 0
  24. -- 2199023264195 | 0 | 0 | 0
  25. -- 4398046511273 | 0 | 1 | 0
  26. -- 4398046521177 | 0 | 0 | 0
  27. -- 6597069768899 | 0 | 0 | 0
  28. -- 6597069770651 | 0 | 1 | 0
  29. -- 6597069771254 | 0 | 0 | 0
  30. -- 6597069771658 | 0 | 0 | 0
  31. -- 6597069775228 | 0 | 0 | 0
  32. -- 8796093023336 | 0 | 0 | 0
  33. -- 8796093029248 | 0 | 2 | 0
  34. -- 8796093029298 | 0 | 0 | 0
  35. -- 8796093029959 | 0 | 0 | 0
  36. -- 8796093031385 | 0 | 0 | 0
  37. -- 8796093032614 | 0 | 0 | 0
  38. -- 10995116278425 | 0 | 1 | 0
  39. -- 10995116279003 | 0 | 2 | 0
  40. -- 10995116279401 | 0 | 1 | 0
  41. -- 10995116284530 | 0 | 0 | 0
  42. -- 10995116284647 | 0 | 0 | 0
  43. -- 13194139534872 | 0 | 0 | 0
  44. -- 13194139537381 | 0 | 0 | 0
  45. -- 13194139541490 | 0 | 0 | 0
  46. -- 13194139542083 | 0 | 21 | 0
  47. -- 15393162789626 | 0 | 1 | 0
  48. -- 15393162790005 | 0 | 0 | 0
  49. -- 15393162790303 | 0 | 1 | 0
  50. -- 15393162791561 | 0 | 0 | 0
  51. -- 15393162795607 | 0 | 0 | 0
  52. -- 15393162796167 | 0 | 0 | 0
  53. -- 15393162797457 | 0 | 0 | 0
  54. -- 15393162797711 | 0 | 0 | 0
  55. -- 15393162798239 | 0 | 0 | 0
  56. -- 17592186045794 | 0 | 0 | 0
  57. -- 17592186050665 | 0 | 0 | 0
  58. -- 17592186051978 | 0 | 79 | 0
  59. -- 19791209302580 | 0 | 0 | 0
  60. -- 19791209310126 | 0 | 0 | 0
  61. -- 19791209310408 | 0 | 0 | 0
  62. -- 21990232558127 | 0 | 0 | 0
  63. -- 21990232560358 | 0 | 0 | 0
  64. -- 21990232561810 | 0 | 0 | 0
  65. -- 21990232563609 | 0 | 0 | 0
  66. -- 24189255811996 | 0 | 0 | 0
  67. -- 24189255812829 | 0 | 0 | 0
  68. -- 24189255812892 | 0 | 0 | 0
  69. -- 24189255813751 | 0 | 0 | 0
  70. -- 24189255819454 | 0 | 0 | 0
  71. -- 24189255820910 | 0 | 0 | 0
  72. -- 26388279066976 | 0 | 0 | 0
  73. -- 26388279074008 | 0 | 0 | 0
  74. -- 26388279075800 | 0 | 0 | 0
  75. -- 28587302322826 | 0 | 0 | 0
  76. -- 28587302323140 | 0 | 0 | 0
  77. -- 28587302323831 | 0 | 0 | 0
  78. -- 28587302332315 | 0 | 0 | 0
  79. -- 28587302332388 | 0 | 0 | 0
  80. -- 30786325580674 | 0 | 0 | 0
  81. -- 30786325582071 | 0 | 0 | 0
  82. -- 32985348836171 | 0 | 0 | 0
  83. -- 32985348840421 | 0 | 0 | 0
  84. -- 35184372090806 | 0 | 0 | 0
  85. -- 35184372091151 | 0 | 0 | 0
  86. -- 35184372093248 | 0 | 0 | 0
  87. -- 35184372095848 | 0 | 0 | 0
  88. -- 35184372096349 | 0 | 0 | 0
  89. -- 35184372097346 | 0 | 0 | 0
  90. -- 35184372097978 | 0 | 1 | 0
  91. -- 35184372098113 | 0 | 0 | 0
  92. -- 35184372098845 | 0 | 0 | 0
  93. -- 35184372098880 | 0 | 0 | 0
  94. -- (88 rows)
  95. --
  96. -- Time: 17709.626 ms (00:17.710)
  97. /* Q13. Zombies in a country
  98. \set country '\'France\''
  99. \set endDate '\'2013-01-01\''::timestamp
  100. */
  101. WITH Zombies AS (
  102. SELECT Person.id AS zombieid
  103. FROM Country
  104. JOIN City
  105. ON City.PartOfCountryId = Country.id
  106. JOIN Person
  107. ON Person.LocationCityId = City.id
  108. LEFT JOIN Message
  109. ON Person.id = Message.CreatorPersonId
  110. AND Message.creationDate BETWEEN Person.creationDate AND :endDate -- the lower bound is an optmization to prune messages
  111. WHERE Country.name = :country
  112. AND Person.creationDate < :endDate
  113. GROUP BY Person.id, Person.creationDate
  114. -- average of [0, 1) messages per month is equivalent with having less messages than the month span between person creationDate and parameter :endDate
  115. HAVING count(Message.MessageId) < 12*extract(YEAR FROM :endDate) + extract(MONTH FROM :endDate)
  116. - (12*extract(YEAR FROM Person.creationDate) + extract(MONTH FROM Person.creationDate))
  117. + 1
  118. )
  119. SELECT Z.zombieid AS "zombie.id"
  120. , coalesce(t.zombieLikeCount, 0) AS zombieLikeCount
  121. , coalesce(t.totalLikeCount, 0) AS totalLikeCount
  122. , CASE WHEN t.totalLikeCount > 0 THEN t.zombieLikeCount::float/t.totalLikeCount ELSE 0 END AS zombieScore
  123. FROM Zombies Z LEFT JOIN (
  124. SELECT Z.zombieid, count(*) as totalLikeCount, sum(case when exists (SELECT 1 FROM Zombies ZL WHERE ZL.zombieid = p.id) then 1 else 0 end) AS zombieLikeCount
  125. FROM Person p, Person_likes_Message plm, Message m, Zombies Z
  126. WHERE Z.zombieid = m.CreatorPersonId AND p.creationDate < :endDate
  127. AND p.id = plm.PersonId AND m.MessageId = plm.MessageId
  128. GROUP BY Z.zombieid
  129. ) t ON (Z.zombieid = t.zombieid)
  130. ORDER BY zombieScore DESC, Z.zombieid
  131. LIMIT 100
  132. ;