Algoritmus   otázka

SQL, Databáze

Dobrý den,

snažím se přijít na nejlepší (tím myslím nejrychlejší :) ) řešení problému, kdy mám v tabulce šest sloupců a v nich čísla.

Potřebuji najít řádek který obsahuje tři čísla, které určím.

Nyní jsem zařídil to, že v tabulce jsou čísla vždy seřezená od nejvyššího po nejnižší (sloupec1 je vždy > než sloupec2 a ten je větší než sloupec3 atd). A tři čísla, která hledám jsou také vždy seřezená.

Spatlal jsem to celé dohromady pomocí milionu ANDů a ORů a složených závorek, ale přijde mi to jako prasárna. Není na to nějaký algoritmus, který bych snadno implementoval?

Nyní je hledám tak, že otestuji všechny varianty.

sloupec1, sloupec2, sloupec3

sloupec1, sloupec2, sloupec4

sloupec1, sloupec2, sloupec5

sloupec1, sloupec2, sloupec6

sloupec2, sloupec3, sloupec4

sloupec2, sloupec3, sloupec5

atd...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

jen doplním, že nehledám řádek, ale řádky... ale to snad bylo jasné

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi bych udělal:

CREATE VIEW Sloupce AS 
SELECT IdRadek, Sloupec1 AS Sloupec FROM tabulka
UNION ALL
SELECT IdRadek, Sloupec2 AS Sloupec FROM tabulka
UNION ALL
SELECT IdRadek, Sloupec3 AS Sloupec FROM tabulka
UNION ALL
SELECT IdRadek, Sloupec4 AS Sloupec FROM tabulka
UNION ALL
SELECT IdRadek, Sloupec5 AS Sloupec FROM tabulka
UNION ALL
SELECT IdRadek, Sloupec6 AS Sloupec FROM tabulka
GO

SELECT * FROM Sloupce t0
JOIN (
  SELECT IdRadek FROM Sloupce WHERE Sloupec = hodnota 
  GROUP BY IdRadek HAVING COUNT(*) >= 3
) t1 ON t0.IdRadek = t1.IdRadek

Jak to bude rychlé, to nevím, ale pokud potřebujete takovýto typ dotazů, tak jste tabulku pravděpodobně nenavrhnul dobře - měl byste mít místo toho tabulku se sloupci Id, Hodnota a IdSloupec (a mít číselník sloupců, nebo na tom IdSloupec mít aspoň constraint, aby tam někdo nedával něco, co tam nepatří).

Protože pak ušetříte ten pohled, který ji z aktuální dělá (ty UNION ALL to zpomalovat budou).

I když neznám konkrétní použití té tabulky - možná pro aktuální schéma máte své důvody.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

dobře děkuji. zkusím to, porovnám rychlost (pokud to dokážu) a dám vědět.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý deň, po 2 mesiacoch asi prichádzam s krížkom po funuse, ale našiel som toto forum až teraz, no a keď ste to neoznačil ako vyriešené, prečo by som nenapísal svoj názor.

Ja by som jednoducho našiel riadky, ktoré obsahujú najvyššiu hodnotu, len z nich vybral riadky s druhou hodnotou a len z nich s treťou. Ak sa čísla v tabulke nie príliš silne opakujú, tak si stroj mákne na dno ;-) len u prvého výberu, potom to už na redukovaných dátach može byť bleskovka.

A ani zápis celého procesu nevypadá nijak drasticky a nezrozumitelne, sú tam aj dva komentáre pre pana Linharta ( to je, s dovolením, narážka na diskusiu k mojmu príspevku v sekcii Off topic )


select *
into #temp1  -- tabulka vsetkych zaznamov obsahujucich najvyssiu hladanú hodnotu
             -- v druhom kroku budem hladat len v tychto zaznamoch a v tretom len 
             -- vo vysledku druheho vyberu
from tabulka
where @hodnota1 in (Sloupec1, Sloupec2, Sloupec3, Sloupec4)
	-- zaznamy, kde je najvyssia hladana hodnota az medzi dvomi najmensimi ma 
	-- uz nezaujimaju ! Analogicky mozem obmedzit hladanie v dalsich krokoch

select *
into #temp2
from #temp1
where @hodnota2 in (Sloupec2, Sloupec3, Sloupec4, Sloupec5)

select *
from #temp2
where @hodnota3 in (Sloupec3, Sloupec4, Sloupec5, Sloupec6)

drop table #temp1
drop table #temp2

Ešte poznamenávam, že ak by som z nejakého dovodu vedel, že vyššie čísla sú v tabulke zastúpené relevantne častejšie, tak by som proces otočil a v prvom kroku hladal najnižšiu hodnotu ( je pravdepodobnejšia silnejšia redukcia )

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback