Skip to content

Instantly share code, notes, and snippets.

@bcleenders
Created July 12, 2015 16:41
Show Gist options
  • Save bcleenders/e446e964f6866bac3906 to your computer and use it in GitHub Desktop.
Save bcleenders/e446e964f6866bac3906 to your computer and use it in GitHub Desktop.
-- The tables I assume you have:
CREATE TABLE articles
(
"Id" serial NOT NULL,
"Date" date,
"Article" text,
"Author" text,
"Title" text,
"Points" integer,
"NumComments" integer,
"Url" text,
"ObjectId" integer,
"Webpage_title" text,
"MetaDescription" text,
"MetaKeywords" text,
"FinalUrl" text,
"TopImage" text
);
-- Could also be an attribute of the previous table, but this is more in line with the data supply (and allows for multiple topics per article)
CREATE TABLE articletopics
(
"articleId" integer,
"topicId" integer
);
-- Descriptions of the topics by providing keywords plus their score (how good they match the topic)
CREATE TABLE topics
(
"topicId" integer,
keyword text,
score double precision
);
-- Create some views that show some statistics
-- (last one is materialized, since it takes like 30 seconds to generate and shouldn't change anyway)
CREATE OR REPLACE VIEW monthlytotalscores AS
SELECT date_part('month'::text, articles."Date") AS month,
date_part('year'::text, articles."Date") AS year,
sum(articles."Points") AS points,
sum(articles."NumComments") AS comments,
count(DISTINCT articles."Id") AS articles
FROM articles,
articletopics
WHERE articles."Id" = articletopics."articleId"
GROUP BY date_part('month'::text, articles."Date"), date_part('year'::text, articles."Date");
CREATE OR REPLACE VIEW monthlytopicscores AS
SELECT mt.topic,
mt.month,
mt.year,
CASE
WHEN r.points IS NULL THEN 0::bigint
ELSE r.points
END AS points,
CASE
WHEN r.comments IS NULL THEN 0::bigint
ELSE r.comments
END AS comments,
CASE
WHEN r.articles IS NULL THEN 0::bigint
ELSE r.articles
END AS articles
FROM ( SELECT t.column1 AS topic,
m.column1 AS month,
m.column2 AS year
FROM ( VALUES (2,2007), (3,2007), (4,2007), (5,2007), (6,2007), (7,2007), (8,2007), (9,2007), (10,2007), (11,2007), (12,2007), (1,2008), (2,2008), (3,2008), (4,2008), (5,2008), (6,2008), (7,2008), (8,2008), (9,2008), (10,2008), (11,2008), (12,2008), (1,2009), (2,2009), (3,2009), (4,2009), (5,2009), (6,2009), (7,2009), (8,2009), (9,2009), (10,2009), (11,2009), (12,2009), (1,2010), (2,2010), (3,2010), (4,2010), (5,2010), (6,2010), (7,2010), (8,2010), (9,2010), (10,2010), (11,2010), (12,2010), (1,2011), (2,2011), (3,2011), (4,2011), (5,2011), (6,2011), (7,2011), (8,2011), (9,2011), (10,2011), (11,2011), (12,2011), (1,2012), (2,2012), (3,2012), (4,2012), (5,2012), (6,2012), (7,2012), (8,2012), (9,2012), (10,2012), (11,2012), (12,2012), (1,2013), (2,2013), (3,2013), (4,2013), (5,2013), (6,2013), (7,2013), (8,2013), (9,2013), (10,2013), (11,2013), (12,2013), (1,2014), (2,2014), (3,2014), (4,2014), (5,2014), (6,2014), (7,2014), (8,2014), (9,2014), (10,2014), (11,2014), (12,2014), (1,2015), (2,2015), (3,2015), (4,2015), (5,2015), (6,2015)) m,
( VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31), (32), (33), (34), (35), (36), (37), (38), (39), (40), (41), (42), (43), (44), (45), (46), (47), (48), (49), (50), (51), (52), (53), (54), (55), (56), (57), (58), (59), (60), (61), (62), (63), (64), (65), (66), (67), (68), (69), (70), (71), (72), (73), (74), (75), (76), (77), (78), (79), (80), (81), (82), (83), (84), (85), (86), (87), (88), (89), (90), (91), (92), (93), (94), (95), (96), (97), (98), (99), (100), (101), (102), (103), (104), (105), (106), (107), (108), (109), (110), (111), (112), (113), (114), (115), (116), (117), (118), (119), (120), (121), (122), (123), (124), (125), (126), (127), (128), (129), (130), (131), (132), (133), (134), (135), (136), (137), (138), (139), (140), (141), (142), (143), (144), (145), (146), (147), (148), (149), (150), (151), (152), (153), (154), (155), (156), (157), (158), (159), (160), (161), (162), (163), (164), (165), (166), (167), (168), (169), (170), (171), (172), (173), (174), (175), (176), (177), (178), (179), (180), (181), (182), (183), (184), (185), (186), (187), (188), (189), (190), (191), (192), (193), (194), (195), (196), (197), (198), (199), (200), (201), (202), (203), (204), (205), (206), (207), (208), (209), (210), (211), (212), (213), (214), (215), (216), (217), (218), (219), (220), (221), (222), (223), (224), (225), (226), (227), (228), (229), (230), (231), (232), (233), (234), (235), (236), (237), (238), (239), (240), (241), (242), (243), (244), (245), (246), (247), (248), (249), (250), (251), (252), (253), (254), (255), (256), (257), (258), (259), (260), (261), (262), (263), (264), (265), (266), (267), (268), (269), (270), (271), (272), (273), (274), (275), (276), (277), (278), (279), (280), (281), (282), (283), (284), (285), (286), (287), (288), (289), (290), (291), (292), (293), (294), (295), (296), (297), (298), (299), (300), (301), (302), (303), (304), (305), (306), (307), (308), (309), (310), (311), (312), (313), (314), (315), (316), (317), (318), (319), (320), (321), (322), (323), (324), (325), (326), (327), (328), (329), (330), (331), (332), (333), (334), (335), (336), (337), (338), (339), (340), (341), (342), (343), (344), (345), (346), (347), (348), (349), (350), (351), (352), (353), (354), (355), (356), (357), (358), (359), (360), (361), (362), (363), (364), (365), (366), (367), (368), (369), (370), (371), (372), (373), (374), (375), (376), (377), (378), (379), (380), (381), (382), (383), (384), (385), (386), (387), (388), (389), (390), (391), (392), (393), (394), (395), (396), (397), (398), (399), (400), (401), (402), (403), (404), (405), (406), (407), (408), (409), (410), (411), (412), (413), (414), (415), (416), (417), (418), (419), (420), (421), (422), (423), (424), (425), (426), (427), (428), (429), (430), (431), (432), (433), (434), (435), (436), (437), (438), (439), (440), (441), (442), (443), (444), (445), (446), (447), (448), (449), (450), (451), (452), (453), (454), (455), (456), (457), (458), (459), (460), (461), (462), (463), (464), (465), (466), (467), (468), (469), (470), (471), (472), (473), (474), (475), (476), (477), (478), (479), (480), (481), (482), (483), (484), (485), (486), (487), (488), (489), (490), (491), (492), (493), (494), (495), (496), (497), (498), (499), (500), (501), (502), (503), (504), (505), (506), (507), (508), (509), (510), (511), (512), (513), (514), (515), (516), (517), (518), (519), (520), (521), (522), (523), (524), (525), (526), (527), (528), (529), (530), (531), (532), (533), (534), (535), (536), (537), (538), (539), (540), (541), (542), (543), (544), (545), (546), (547), (548), (549), (550), (551), (552), (553), (554), (555), (556), (557), (558), (559), (560), (561), (562), (563), (564), (565), (566), (567), (568), (569), (570), (571), (572), (573), (574), (575), (576), (577), (578), (579), (580), (581), (582), (583), (584), (585), (586), (587), (588), (589), (590), (591), (592), (593), (594), (595), (596), (597), (598), (599), (600), (601), (602), (603), (604), (605), (606), (607), (608), (609), (610), (611), (612), (613), (614), (615), (616), (617), (618), (619), (620), (621), (622), (623), (624), (625), (626), (627), (628), (629), (630), (631), (632), (633), (634), (635), (636), (637), (638), (639), (640), (641), (642), (643), (644), (645), (646), (647), (648), (649), (650), (651), (652), (653), (654), (655), (656), (657), (658), (659), (660), (661), (662), (663), (664), (665), (666), (667), (668), (669), (670), (671), (672), (673), (674), (675), (676), (677), (678), (679), (680), (681), (682), (683), (684), (685), (686), (687), (688), (689), (690), (691), (692), (693), (694), (695), (696), (697), (698), (699), (700), (701), (702), (703), (704), (705), (706), (707), (708), (709), (710), (711), (712), (713), (714), (715), (716), (717), (718), (719), (720), (721), (722), (723), (724), (725), (726), (727), (728), (729), (730), (731), (732), (733), (734), (735), (736), (737), (738), (739), (740), (741), (742), (743), (744), (745), (746), (747), (748), (749), (750), (751), (752), (753), (754), (755), (756), (757), (758), (759), (760), (761), (762), (763), (764), (765), (766), (767), (768), (769), (770), (771), (772), (773), (774), (775), (776), (777), (778), (779), (780), (781), (782), (783), (784), (785), (786), (787), (788), (789), (790), (791), (792), (793), (794), (795), (796), (797), (798), (799), (800), (801), (802), (803), (804), (805), (806), (807), (808), (809), (810), (811), (812), (813), (814), (815), (816), (817), (818), (819), (820), (821), (822), (823), (824), (825), (826), (827), (828), (829), (830), (831), (832), (833), (834), (835), (836), (837), (838), (839), (840), (841), (842), (843), (844), (845), (846), (847), (848), (849), (850), (851), (852), (853), (854), (855), (856), (857), (858), (859), (860), (861), (862), (863), (864), (865), (866), (867), (868), (869), (870), (871), (872), (873), (874), (875), (876), (877), (878), (879), (880), (881), (882), (883), (884), (885), (886), (887), (888), (889), (890), (891), (892), (893), (894), (895), (896), (897), (898), (899), (900), (901), (902), (903), (904), (905), (906), (907), (908), (909), (910), (911), (912), (913), (914), (915), (916), (917), (918), (919), (920), (921), (922), (923), (924), (925), (926), (927), (928), (929), (930), (931), (932), (933), (934), (935), (936), (937), (938), (939), (940), (941), (942), (943), (944), (945), (946), (947), (948), (949), (950), (951), (952), (953), (954), (955), (956), (957), (958), (959), (960), (961), (962), (963), (964), (965), (966), (967), (968), (969), (970), (971), (972), (973), (974), (975), (976), (977), (978), (979), (980), (981), (982), (983), (984), (985), (986), (987), (988), (989), (990), (991), (992), (993), (994), (995), (996), (997), (998), (999)) t) mt
LEFT JOIN ( SELECT date_part('month'::text, articles."Date") AS month,
date_part('year'::text, articles."Date") AS year,
sum(articles."Points") AS points,
sum(articles."NumComments") AS comments,
count(DISTINCT articles."Id") AS articles,
topics."topicId" AS topic
FROM articles,
articletopics,
topics
WHERE articles."Id" = articletopics."articleId" AND articletopics."topicId" = topics."topicId"
GROUP BY date_part('month'::text, articles."Date"), date_part('year'::text, articles."Date"), topics."topicId"
ORDER BY date_part('year'::text, articles."Date") DESC, date_part('month'::text, articles."Date") DESC) r ON mt.topic = r.topic AND r.month = mt.month::double precision AND r.year = mt.year::double precision;
CREATE MATERIALIZED VIEW monthlyrelativetopicscores AS
SELECT tot.month,
tot.year,
top.topic,
-- Multiply by 10,000 to make them basispoints (per tenthousand)
top.points * 10000 / tot.points AS pointspromille,
top.articles * 10000 / tot.articles AS articlespromille,
top.comments * 10000 / tot.comments AS commentspromille,
(top.points * 10000 / tot.points + top.articles * 10000 / tot.articles + top.comments * 10000 / tot.comments) / 3 AS popularity
FROM monthlytopicscores top,
monthlytotalscores tot
WHERE top.year = tot.year AND top.month = tot.month
WITH DATA;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment