q08.sql 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. \set tag '\'Abbas_I_of_Persia\''
  2. \set startDate '\'2010-06-14\''::timestamp
  3. \set endDate '\'2010-06-28\''::timestamp
  4. -- materialize=> \i q08.sql
  5. -- person.id | score | friendsscore
  6. -- ----------------+-------+--------------
  7. -- 15393162796516 | 100 | 2304
  8. -- 10995116284819 | 100 | 2202
  9. -- 4398046514439 | 101 | 2102
  10. -- 8796093028727 | 100 | 2101
  11. -- 28587302329901 | 100 | 2001
  12. -- 15393162797781 | 100 | 1902
  13. -- 8796093029396 | 100 | 1901
  14. -- 6597069771580 | 100 | 1900
  15. -- 15393162796938 | 100 | 1803
  16. -- 10995116287504 | 100 | 1801
  17. -- 8796093027051 | 100 | 1800
  18. -- 21990232558345 | 100 | 1703
  19. -- 17592186051103 | 100 | 1601
  20. -- 19791209301605 | 100 | 1600
  21. -- 28587302324075 | 100 | 1600
  22. -- 2199023255976 | 102 | 1501
  23. -- 24189255814035 | 100 | 1500
  24. -- 8796093024055 | 100 | 1402
  25. -- 32985348842801 | 100 | 1402
  26. -- 30786325582257 | 100 | 1401
  27. -- 21990232560968 | 100 | 1400
  28. -- 19791209301779 | 100 | 1301
  29. -- 28587302331208 | 100 | 1200
  30. -- 30786325582458 | 100 | 1200
  31. -- 2199023260693 | 100 | 1103
  32. -- 30786325586956 | 100 | 1101
  33. -- 28587302330254 | 100 | 1100
  34. -- 6597069769336 | 100 | 1003
  35. -- 21990232556992 | 100 | 1000
  36. -- 21990232564593 | 100 | 1000
  37. -- 24189255814629 | 100 | 1000
  38. -- 26388279073300 | 100 | 1000
  39. -- 10995116281487 | 100 | 902
  40. -- 26388279074645 | 100 | 901
  41. -- 28587302330225 | 100 | 900
  42. -- 32985348842020 | 100 | 900
  43. -- 30786325582484 | 100 | 802
  44. -- 9104 | 100 | 703
  45. -- 4398046514572 | 100 | 703
  46. -- 30786325587534 | 100 | 701
  47. -- 13194139541181 | 100 | 700
  48. -- 15393162794315 | 100 | 600
  49. -- 32985348842546 | 100 | 502
  50. -- 21990232564402 | 100 | 500
  51. -- 2199023257012 | 100 | 404
  52. -- 28587302328411 | 100 | 400
  53. -- 32985348843709 | 100 | 400
  54. -- 4398046511722 | 102 | 300
  55. -- 13194139541245 | 100 | 302
  56. -- 15393162797039 | 100 | 201
  57. -- 35184372096631 | 100 | 200
  58. -- 37383395346899 | 100 | 200
  59. -- 8698 | 101 | 100
  60. -- 24189255811121 | 100 | 101
  61. -- 28587302329837 | 100 | 101
  62. -- 4091 | 100 | 100
  63. -- 4398046517503 | 100 | 100
  64. -- 13194139537876 | 100 | 100
  65. -- 30786325582666 | 100 | 100
  66. -- 32985348841739 | 100 | 100
  67. -- 35184372095947 | 100 | 100
  68. -- 5671 | 101 | 0
  69. -- 9475 | 100 | 0
  70. -- 2199023255573 | 100 | 0
  71. -- 2199023258115 | 100 | 0
  72. -- 2199023258475 | 100 | 0
  73. -- 2199023259981 | 100 | 0
  74. -- 2199023261409 | 100 | 0
  75. -- 2199023263186 | 100 | 0
  76. -- 2199023265455 | 100 | 0
  77. -- 4398046519791 | 100 | 0
  78. -- 4398046519912 | 100 | 0
  79. -- 4398046519918 | 100 | 0
  80. -- 4398046519949 | 100 | 0
  81. -- 6597069769432 | 100 | 0
  82. -- 6597069770566 | 100 | 0
  83. -- 13194139543653 | 100 | 0
  84. -- 15393162795159 | 100 | 0
  85. -- 15393162798002 | 100 | 0
  86. -- 21990232558087 | 100 | 0
  87. -- 21990232559362 | 100 | 0
  88. -- 24189255815070 | 100 | 0
  89. -- 26388279069740 | 100 | 0
  90. -- 26388279074274 | 100 | 0
  91. -- 28587302331312 | 100 | 0
  92. -- 30786325584433 | 100 | 0
  93. -- 32985348836171 | 100 | 0
  94. -- 32985348839448 | 100 | 0
  95. -- 35184372097346 | 100 | 0
  96. -- 37383395348360 | 100 | 0
  97. -- 37383395353132 | 100 | 0
  98. -- (91 rows)
  99. --
  100. -- Time: 10117.007 ms (00:10.117)
  101. /* Q8. Central person for a tag
  102. \set tag '\'Che_Guevara\''
  103. \set startDate '\'2011-07-20\''::timestamp
  104. \set endDate '\'2011-07-25\''::timestamp
  105. */
  106. WITH Person_interested_in_Tag AS (
  107. SELECT Person.id AS PersonId
  108. FROM Person
  109. JOIN Person_hasInterest_Tag
  110. ON Person_hasInterest_Tag.PersonId = Person.id
  111. JOIN Tag
  112. ON Tag.id = Person_hasInterest_Tag.TagId
  113. AND Tag.name = :tag
  114. )
  115. , Person_Message_score AS (
  116. SELECT Person.id AS PersonId
  117. , count(*) AS message_score
  118. FROM Tag
  119. JOIN Message_hasTag_Tag
  120. ON Message_hasTag_Tag.TagId = Tag.id
  121. JOIN Message
  122. ON Message_hasTag_Tag.MessageId = Message.MessageId
  123. AND :startDate < Message.creationDate
  124. JOIN Person
  125. ON Person.id = Message.CreatorPersonId
  126. WHERE Tag.name = :tag
  127. AND Message.creationDate < :endDate
  128. GROUP BY Person.id
  129. )
  130. , Person_score AS (
  131. SELECT coalesce(Person_interested_in_Tag.PersonId, pms.PersonId) AS PersonId
  132. , CASE WHEN Person_interested_in_Tag.PersonId IS NULL then 0 ELSE 100 END -- scored from interest in the given tag
  133. + coalesce(pms.message_score, 0) AS score
  134. FROM Person_interested_in_Tag
  135. FULL JOIN Person_Message_score pms
  136. ON Person_interested_in_Tag.PersonId = pms.PersonId
  137. )
  138. SELECT p.PersonId AS "person.id"
  139. , p.score AS score
  140. , coalesce(sum(f.score), 0) AS friendsScore
  141. FROM Person_score p
  142. LEFT JOIN Person_knows_Person
  143. ON Person_knows_Person.Person1Id = p.PersonId
  144. LEFT JOIN Person_score f -- the friend
  145. ON f.PersonId = Person_knows_Person.Person2Id
  146. GROUP BY p.PersonId, p.score
  147. ORDER BY p.score + coalesce(sum(f.score), 0) DESC, p.PersonId
  148. LIMIT 100
  149. ;