/ / MySql subquery: priemerný rozdiel, zoskupený podľa stĺpca - mysql, sql, group-by, subquery

MySql subquery: priemerný rozdiel, zoskupený podľa stĺpca - mysql, sql, group-by, subquery

Mám mysql stôl s visitor_id, country, time_of_visit.

Chcem získať priemerné trvanie návštevy podľa krajiny.

Ak chcete získať trvanie, dostanem rozdiel medzi najskorším a najnovším časom_zobrazenia pre každý návštevník_id.

Takže mi to znamená priemerné trvanie všetkých návštev:

    SELECT AVG(duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration
FROM tracker
GROUP BY visitor_id
) as tracker

Funguje to. Ale zoskupiť ju podľa krajiny, zlyhám. Tu je môj posledný pokus získať priemerné trvanie podľa krajiny:

SELECT country, AVG(duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration
FROM tracker
GROUP BY visitor_id
) as tracker
GROUP BY country

Chyba, ktorú mám, je: Neznámy stĺpec "krajina" v "zozname polí".

Myslím, že by to malo byť jednoduché, ale ja som noob, hľadal som veľa, skúsil veľa nápadov, ale nič dobré.

Vopred ďakujem.

odpovede:

0 pre odpoveď č. 1

Musíte vybrať stĺpec krajiny v subdotáciách a potom musíte odkazovať na pole krajiny z odvodenej tabuľky tracker.country

SELECT tracker.country, AVG(tracker.duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration ,country
FROM tracker
GROUP BY visitor_id
) as tracker
GROUP BY tracker.country

editovať

Použitím GROUP BY v subselect visitor_id vám dá záznam s duplicitnými údajmi pre krajiny a pri použití GROUP BY s oboma visitor_id,country zoskupí údaje krajín v rámcirovnaký id návštevníka, toto bude možné iba v prípade, že jeden návštevník bude patriť viac než jedna krajina, ak jeden návštevník bude patriť iba k jednej krajine tj jeden-k-jeden vzťah potom len používať GROUP BY visitor_id


0 pre odpoveď č. 2

Je potrebné zadať stĺpec v poddotazovaní, ktorý chcete zobraziť vo vonkajšom dopyte Skúste to::

SELECT country, AVG(duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration, country
FROM tracker
GROUP BY visitor_id
) as tracker
GROUP BY country

Môžete tiež vyskúšať:

SELECT
country,
AVG(TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60) as avgTime
FROM
GROUP BY visitor_id,country

0 pre odpoveď č. 3

Mali by ste pridať COUNTRY do vnútorného GROUP BY a zoznamu polí

SELECT country, AVG(duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration,country,visitor_id
FROM tracker
GROUP BY visitor_id,country
) as tracker
GROUP BY country