q11.sql 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. \set country '\'India\''
  2. \set startDate '\'2012-09-28\''::timestamp
  3. \set endDate '\'2013-01-10\''::timestamp
  4. -- materialize=> \i q11.sql
  5. -- count
  6. -- -------
  7. -- 840
  8. -- (1 row)
  9. --
  10. -- Time: 330.155 ms
  11. /* Q11. Friend triangles
  12. \set country '\'China\''
  13. \set startDate '\'2010-06-01\''::timestamp
  14. \set endDate '\'2010-07-01\''::timestamp
  15. */
  16. WITH Persons_of_country_w_friends AS (
  17. SELECT Person.id AS PersonId
  18. , Person_knows_Person.Person2Id AS FriendId
  19. , Person_knows_Person.creationDate AS creationDate
  20. FROM Person
  21. JOIN City
  22. ON City.id = Person.LocationCityId
  23. JOIN Country
  24. ON Country.id = City.PartOfCountryId
  25. AND Country.name = :country
  26. JOIN Person_knows_Person
  27. ON Person_knows_Person.Person1Id = Person.id
  28. )
  29. SELECT count(*)
  30. FROM Persons_of_country_w_friends p1
  31. JOIN Persons_of_country_w_friends p2
  32. ON p1.FriendId = p2.PersonId
  33. JOIN Persons_of_country_w_friends p3
  34. ON p2.FriendId = p3.PersonId
  35. AND p3.FriendId = p1.PersonId
  36. WHERE true
  37. -- filter: unique triangles only
  38. AND p1.PersonId < p2.PersonId
  39. AND p2.PersonId < p3.PersonId
  40. -- filter: only edges created after :startDate
  41. AND :startDate <= p1.creationDate AND p1.creationDate <= :endDate
  42. AND :startDate <= p2.creationDate AND p2.creationDate <= :endDate
  43. AND :startDate <= p3.creationDate AND p3.creationDate <= :endDate
  44. ;