SQL agregace hodnoty z jednoho sloupce

0

Otázka

Předpokládejme, že mám na stole, jako je tento:

Id url
1 11.22.33
2 11.22.33
3 domain.com
4 domain2.com
5 domain.com
6 10.100.15
7 domain3.com
8 172.100.15
9 172.100.15

V této tabulce, některé IP adresy jsou spojeny s některé domény a můžeme zvážit, je, že jednu adresu URL. (Například, domain2.com, 10.100.15, 11.22.33 - to je domain2.com; 172.100.15, domain3.com - domain3.com, atd.). Můj úkol je, že musím spočítat řádky s různými doménami a udělat tabulku jako je tato:

url počítat
domain2 4
domény 2
domain3 2

Jsem mohl jen počítat s několika dotazy, jako například:

SELECT COUNT(*) 
FROM table1
WHERE (table1.url = “10.100.15”
    OR table1.url = “11.22.33” OR table1.url = “domain2.com”)

a aby tyto tabulky ručně, ale to není v pohodě.

Jak jsem to mohl udělat v jednom dotazu?

PS: jak již bylo zmíněno v komentáři níže, obvykle agregace může být provedeno s jeden jednoduchý dotaz:

SELECT url, count(*) 
FROM table1
WHERE GROUP BY url

Ale dává mi pouze tabulka, jako je tento:

URL počítat
domain2 1
domény 2
11.22.33 2
10.100.15 1

Nebo jsem něco chybí?

case count group-by sql
2021-11-14 12:20:36
3

Nejlepší odpověď

1

Můžete seskupit podle CASE vyjádření:

SELECT CASE 
         WHEN URL IN ('10.100.15', '11.22.33', 'domain2.com') THEN 'domain2.com'
         WHEN URL IN ('172.100.15', 'domain3.com') THEN 'domain3.com'
         ELSE URL
       END domain,
       COUNT(*) count
FROM tablename
GROUP BY domain;

Viz demo.

2021-11-14 13:52:59

Cool! Děkuji!!! Jen to, co potřebuji.
Pavel Grebenyuk
1

Více elegantní způsob, jak je mít sdružení uloženy v databázi, dosáhnout toho, že:

WITH
-- your input ...
indata(Id,url) AS (
          SELECT 1,'11.22.33'
UNION ALL SELECT 2,'11.22.33'
UNION ALL SELECT 3,'domain.com'
UNION ALL SELECT 4,'domain2.com'
UNION ALL SELECT 5,'domain.com'
UNION ALL SELECT 6,'10.100.15'
UNION ALL SELECT 7,'domain3.com'
UNION ALL SELECT 8,'172.100.15'
UNION ALL SELECT 9,'172.100.15'
)
,
-- need an association table - which "url" belongs to which domain
assoc(dom,url) AS (
            SELECT 'domain2.com','10.100.15'
  UNION ALL SELECT 'domain2.com','11.22.33'
  UNION ALL SELECT 'domain3.com','172.100.15'
)
SELECT
  CASE 
    WHEN a.dom IS NULL THEN i.url
    ELSE a.dom
  END AS domain
, COUNT(*) AS counter
FROM indata AS i
LEFT
JOIN assoc  AS a USING(url)
GROUP BY domain
;

-- out
-- out    domain    | counter
-- out -------------+---------
-- out  domain2.com |       4                                                                                                                                                                             
-- out  domain3.com |       3
-- out  domain.com  |       2
-- out (3 rows)
2021-11-14 13:46:49

Obecně řečeno, je to chytrý přístup, i když trochu zbytečné v mém případě. Každopádně, děkuji! To by mohlo být užitečné.
Pavel Grebenyuk
0

Byste měli použít group by funkce a psát kód, jako je tento:

VYBERTE adresu URL, count(*) z tabulka1 kde URL('doména1','domain2') skupiny (URL)

to bude fungovat!

2021-11-14 16:28:37

Ne, to není. To mi dává počítání každé URL. Budu muset kombinovat některé řádky, které přiřadit k JEDNÉ domény.
Pavel Grebenyuk

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................