Wprowadzenie
w moim projekcie zapisuję strony z Facebooka i ich podobną liczbę, a także podobną liczbę dla każdego kraju. Mam tabelę dla stron Facebook, jedną dla języków, jedną dla korelacji między stroną na Facebooku i językiem (i licząc podobieństwa) i jedną tabelą, która zapisuje te dane jako historię. Chcę uzyskać stronę o największym wzroście liczby polubień w określonym przedziale czasu.Analiza regresyjna w MySQL
danych do pracy z
mam stripping niepodlegania istotnych informacji z zapytaniami tworzą.
tabelę zawierającą strony facebook
CREATE TABLE `pages` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`facebook_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`facebook_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`facebook_likes` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Przykład Dane:
INSERT INTO `facebook_pages` (`id`, `facebook_id`, `facebook_name`, `facebook_likes`)
VALUES
(1, '552825254796051', 'Mesut Özil', 28593755),
(2, '134904013188254', 'Borussia Dortmund', 13213354),
(3, '310111039010406', 'Marco Reus', 12799627);
tabelę zawierającą języki
CREATE TABLE `languages` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`language` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Przykładowe dane
INSERT INTO `languages` (`id`, `language`)
VALUES
(1, 'ID'),
(2, 'TR'),
(3, 'BR');
tabelę zawierającą związek
CREATE TABLE `language_page_likes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`language_id` int(10) unsigned NOT NULL,
`facebook_page_id` int(10) unsigned NOT NULL,
`likes` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
// Foreign key stuff
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Przykładowe dane
INSERT INTO `language_page_likes` (`id`, `language_id`, `facebook_page_id`)
VALUES
(1, 1, 1),
(2, 2, 1),
(3, 3, 1),
(47, 3, 2),
(51, 1, 2),
(53, 2, 2),
(92, 3, 3),
(95, 2, 3),
(97, 1, 3);
tabeli zawierającej historię
CREATE TABLE `language_page_likes_history` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`language_page_likes_id` int(10) unsigned NOT NULL,
`likes` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
// Foreign key stuff
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Przykładowe dane
INSERT INTO `language_page_likes_history` (`id`, `language_page_likes_id`, `likes`, `created_at`)
VALUES
(1, 1, 3272484, '2015-09-11 08:40:23'),
(132014, 1, 3272827, '2015-09-14 08:31:00'),
(2, 2, 1581361, '2015-09-11 08:40:23'),
(132015, 2, 1580392, '2015-09-14 08:31:00'),
(3, 3, 1467090, '2015-09-11 08:40:23'),
(132016, 3, 1467329, '2015-09-14 08:31:00'),
(47, 47, 828736, '2015-09-11 08:40:23'),
(132060, 47, 828971, '2015-09-14 08:31:00'),
(51, 51, 602747, '2015-09-11 08:40:23'),
(132064, 51, 603071, '2015-09-14 08:31:00'),
(53, 53, 545484, '2015-09-11 08:40:23'),
(132066, 53, 545092, '2015-09-14 08:31:00'),
(92, 92, 916570, '2015-09-11 08:40:24'),
(5, 92, 917032, '2015-09-14 08:31:01'),
(95, 95, 537382, '2015-09-11 08:40:24'),
(8, 95, 537395, '2015-09-14 08:31:01'),
(97, 97, 419175, '2015-09-11 08:40:24'),
(132110, 97, 419484, '2015-09-14 08:31:01');
Jak widać, mam dane dla 14 i 11 września. Teraz chcę uzyskać stronę, z największym wzrostem polubień. Zanim zrobię to za pomocą kolumny o nazwie last_like_count, ale problem polega na tym, że nie mogę być dynamiczny w zakresie dat. Dzięki "normalnej" funkcji regresji mogę być dynamiczny dla każdego zakresu dat.
Rozwiązanie znalezienie
Co już udało się zrobić, było zbudowanie wszystkie relacje, które są obecne
SELECT p.id, p.facebook_name, plh.likes, l.language FROM facebook_pages p
INNER JOIN language_page_likes pl ON pl.facebook_page_id = p.id
INNER JOIN language_page_likes_history plh ON plh.language_page_likes_id = pl.id
INNER JOIN languages l ON l.id = pl.language_id
WHERE pl.language_id = 5 OR pl.language_id = 46 OR pl.language_id = 68
Z tego zapytania dostaję za każdym likecount w historii systemu specyficzny Języki. Ale w jaki sposób zbudowałbym analizę regresji w tej części?
ja już znalazłem ten link tutaj
Identifying trend with SQL query
ale moje umiejętności matematyczne i MySQL nie są wystarczająco wysokie, aby przetłumaczyć SQL w MySQL. Jakaś pomoc?
to dość proste, jeśli RDBMS obsługuje funkcje okienkowe (jak w linku pisał), ale niestety, MySQL brakuje wielu funkcji, które mają inne RDBMS. Najbardziej sensownym rozwiązaniem byłoby przejście na RDBMS, który obsługuje funkcje okienkowania (np. PostgreSQL). –
Przełączanie RDBMS jest najrozsądniejszym rozwiązaniem do rozwiązania pojedynczego pytania analizy danych? – rwking