q14.sql 4.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. \set country1 '\'Philippines\''
  2. \set country2 '\'Taiwan\''
  3. -- materialize=> \i q14.sql
  4. -- person1.id | person2.id | city1.name | score
  5. -- ----------------+----------------+----------------+-------
  6. -- 2199023266161 | 2199023259897 | Cavite_City | 16
  7. -- 4398046514165 | 30786325580485 | Makati | 16
  8. -- 4398046516434 | 2199023259897 | Ermita | 16
  9. -- 4398046516776 | 24189255821690 | Sampaloc | 16
  10. -- 4398046517769 | 30786325580485 | Mandaluyong | 16
  11. -- 4398046521222 | 2199023259897 | Malate | 16
  12. -- 4398046521507 | 19791209308287 | Naga | 16
  13. -- 6597069768162 | 8001 | Kalibo | 16
  14. -- 6597069775480 | 6597069769061 | Pasay | 16
  15. -- 6597069775831 | 2199023259897 | Santa_Rosa | 16
  16. -- 8796093022752 | 8001 | Intramuros | 16
  17. -- 8796093030118 | 19791209308287 | San_Miguel | 16
  18. -- 10995116284563 | 4398046513747 | Davao_City | 16
  19. -- 15393162793426 | 4398046513747 | Angeles | 16
  20. -- 17592186046583 | 10995116279524 | Iligan | 16
  21. -- 17592186047071 | 19791209308287 | Malolos | 16
  22. -- 17592186053366 | 17592186050725 | Los_Baños | 16
  23. -- 17592186053760 | 2199023258965 | Zamboanga_City | 16
  24. -- 19791209300166 | 13194139534446 | Cabanatuan | 16
  25. -- 19791209304999 | 13194139534446 | Laoag | 16
  26. -- 19791209309287 | 6456 | Biñan | 16
  27. -- 28587302324919 | 2199023259897 | Manila | 16
  28. -- 30786325587555 | 17592186044852 | Bacolod | 16
  29. -- 4398046521694 | 13194139534446 | Lipa | 15
  30. -- 8796093031783 | 10995116280964 | Tagbilaran | 15
  31. -- 21990232557022 | 6456 | Legazpi | 15
  32. -- 21990232561626 | 6597069769061 | Quezon_City | 15
  33. -- (27 rows)
  34. --
  35. -- Time: 16166.126 ms (00:16.166)
  36. /* Q14. International dialog
  37. \set country1 '\'Chile\''
  38. \set country2 '\'Argentina\''
  39. */
  40. WITH PersonPairCandidates AS (
  41. SELECT Person1.id AS Person1Id
  42. , Person2.id AS Person2Id
  43. , City1.id AS cityId
  44. , City1.name AS cityName
  45. FROM Country Country1
  46. JOIN City City1
  47. ON City1.PartOfCountryId = Country1.id
  48. JOIN Person Person1
  49. ON Person1.LocationCityId = City1.id
  50. JOIN Person_knows_Person
  51. ON Person_knows_Person.Person1Id = Person1.id
  52. JOIN Person Person2
  53. ON Person2.id = Person_knows_Person.Person2Id
  54. JOIN City City2
  55. ON Person2.LocationCityId = City2.id
  56. JOIN Country Country2
  57. ON Country2.id = City2.PartOfCountryId
  58. WHERE Country1.name = :country1
  59. AND Country2.name = :country2
  60. )
  61. , PPC(Person1Id, Person2Id, Flipped) AS (
  62. SELECT Person1Id AS Person1Id, Person2Id AS Person2Id, false AS Flipped FROM PersonPairCandidates
  63. UNION ALL
  64. SELECT Person2Id AS Person1Id, Person1Id AS Person2Id, true As Flipped FROM PersonPairCandidates
  65. )
  66. , pair_scores AS (
  67. SELECT CASE WHEN Flipped THEN Person2Id ELSE Person1Id END AS Person1Id,
  68. CASE WHEN Flipped THEN Person1Id ELSE Person2Id END AS Person2Id,
  69. (
  70. CASE WHEN EXISTS (SELECT 1 FROM Message m, Message r WHERE m.MessageId = r.ParentMessageId AND Person1Id = r.CreatorPersonId AND Person2Id = m.CreatorPersonId AND EXISTS (SELECT 1 FROM PPC x WHERE x.Person1Id = r.CreatorPersonId)) THEN (CASE WHEN Flipped THEN 1 ELSE 4 END) ELSE 0 END +
  71. CASE WHEN EXISTS (SELECT 1 FROM Message m, Person_likes_Message l WHERE Person2Id = m.CreatorPersonId AND m.MessageId = l.MessageId AND l.PersonId = Person1Id AND EXISTS (SELECT 1 FROM PPC x WHERE x.Person1Id = l.PersonId)) THEN (CASE WHEN Flipped THEN 1 ELSE 10 END) ELSE 0 END
  72. ) as score
  73. FROM PPC
  74. )
  75. , pair_scoresX AS (
  76. SELECT Person1Id, Person2Id, sum(score) as score
  77. FROM pair_scores
  78. GROUP BY Person1Id, Person2Id
  79. )
  80. , score_ranks AS (
  81. SELECT DISTINCT ON (cityId)
  82. PersonPairCandidates.Person1Id, PersonPairCandidates.Person2Id, cityId, cityName
  83. , s.score AS score
  84. FROM PersonPairCandidates
  85. LEFT JOIN pair_scoresX s
  86. ON s.Person1Id = PersonPairCandidates.Person1Id
  87. AND s.person2Id = PersonPairCandidates.Person2Id
  88. ORDER BY cityId, s.score DESC, PersonPairCandidates.Person1Id, PersonPairCandidates.Person2Id
  89. )
  90. SELECT score_ranks.Person1Id AS "person1.id"
  91. , score_ranks.Person2Id AS "person2.id"
  92. , score_ranks.cityName AS "city1.name"
  93. , score_ranks.score
  94. FROM score_ranks
  95. ORDER BY score_ranks.score DESC, score_ranks.Person1Id, score_ranks.Person2Id
  96. LIMIT 100
  97. ;