Zjednodušení dotazu - jak bez dočasné tabulky? – MS SQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zjednodušení dotazu - jak bez dočasné tabulky? – MS SQL – Fórum – Programujte.comZjednodušení dotazu - jak bez dočasné tabulky? – MS SQL – Fórum – Programujte.com

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vytvořte si vlastní webové stránky. Snadno, rychle a levně přes Saywebpage.com
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

1. 4. 2020   #1
-
0
-

Ahoj,

zase zápasím se složitostí dotazu. Povedlo se mi dosáhnout požadovaného výsledku s dočasnou tabulkou:

select Teploty.[Datum a čas], Teploty.pec1, Teploty.pec2 into #tt from Teploty join #MeasInfo ON
[Datum a čas] >= zacatek AND [Datum a čas] <= konec
where Teploty.[Datum a čas] between '2020-04-01 13:43:25' and '2020-04-01 13:44:00';

select * from #tt where (DATEDIFF(second, (select min([Datum a čas]) from #tt), [Datum a čas]) % 5) = 0;
drop table #tt;


Z výsledku prvního dotazu se ve druhém dotazu vybere první záznam a pak každý další, který má od prvního záznamu odstup rovný násobku 5 sekund. Tím se získají záznamy s rozestupem 5 sekund.

Jak dosáhnout stejného výsledku bez dočasné tabulky #tt?

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:18d:c3dd:2e38:3df5...–
MilanL+1
Expert
2. 4. 2020   #2
-
0
-

#1 hlucheucho
je třeba tam mít navíc to Measifno začátek konec, když je tam ten between na čas?

zkusil bych to nějak takhle

select Teploty.[Datum a čas], Teploty.pec1, Teploty.pec2 
from Teploty 
where (DATEDIFF(second, 
(select min([Datum a čas]) from 
    (select [Datum a čas] from Teploty
    join #MeasInfo ON
    [Datum a čas] >= zacatek AND [Datum a čas] <= konec
    where Teploty.[Datum a čas] between '2020-04-01 13:43:25' and '2020-04-01 13:44:00' 
    )
), [Datum a čas]) % 5) = 0;
Nahlásit jako SPAM
IP: 91.139.9.–
2. 4. 2020   #3
-
0
-

#2 MilanL
#MeasInfo tam bohužel být musí. Z něj se získávají použité sloupce (pec1, pec2, atd), dotaz se skládá dynamicky na základě informací z #MeasInfo. Tady je kvůli zjednodušení dotaz již složený. Co se týče dynamického počtu sloupců ve výsledném recordsetu, vygůglil jsem akorát tvrzení, že nelze to udělat v dotazu jako takovém. Buď musí aplikace dotaz dynamicky složit s požadovanými sloupci (což dělám) nebo musí aplikace z recordsetu nadbytečné sloupce odstranit. #MeasInfo navíc obsahuje další začátky a konce získané podle zadaného názvu a poznámky k měření.

Tvoje řešení vyzkouším až večer.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:6053:b221:bf3d:b480...–
2. 4. 2020   #4
-
0
-

Hlásí syntaktickou chybu blízko první závorky na posledním řádku. Když doplním alias 

select Teploty.[Datum a čas], Teploty.pec1, Teploty.pec2 
from Teploty 
where (DATEDIFF(second, 
(select min([Datum a čas]) from 
    (select [Datum a čas] from Teploty
    join ##MeasInfo ON
    [Datum a čas] >= zacatek AND [Datum a čas] <= konec
    where Teploty.[Datum a čas] between '2020-04-01 13:43:25' and '2020-04-01 13:44:00' 
    ) AS td
), [Datum a čas]) % 5) = 0;


dotaz proběhne, ale vrátí data od zvoleného počátku až do nejnovějších dat včetně. Bohužel to není ono.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:3848:77cb:3b7a:7f7f...–
2. 4. 2020   #5
-
0
-

Ještě jsem zkusil tohle 

SELECT * FROM Teploty where [Datum a čas] in (SELECT [Datum a čas] FROM Teploty join ##MeasInfo ON
[Datum a čas] >= zacatek AND [Datum a čas] <= konec
where Teploty.[Datum a čas] between '2020-04-01 13:43:25' and '2020-04-01 13:44:00' )
AND (DATEDIFF(second,
(select min(Teploty.[Datum a čas]) from Teploty join ##MeasInfo ON [Datum a čas] >= zacatek AND [Datum a čas] <= konec
where Teploty.[Datum a čas] between '2020-04-01 13:43:25' and '2020-04-01 13:44:00'),
[Datum a čas]) % 5) = 0;


Nepoužívá dočasnou tabulku #tt, funguje, ale je složitý jak mlátička.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:3848:77cb:3b7a:7f7f...–
MilanL+1
Expert
3. 4. 2020   #6
-
0
-

#5 hlucheucho
takže taková kombinace původního a  mého co?

ono ty subselecty si v podstatě také dělaj dočasné tabulky, ale nejspíš jen v paměti takže to může být rychlejší, než to vytvoření klasické dočasné tabulky.

Zkus srovnat časy provedení.

Nahlásit jako SPAM
IP: 91.139.9.–
3. 4. 2020   #7
-
0
-

#6 MilanL
takže taková kombinace původního a  mého co?

Jo, úplná bramboračka. Bohužel subselect nejde udělat jen jednou, označit jako tabulku a použít znovu. Jestli si dobře pamatuju, u MySQL to šlo.

Možná to bude rychlejší, ale dynamicky poskládat takový dotaz bude horor. Nakonec se budu muset rozhodnout pro menší zlo.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:b101:d034:adc:1cbf...–
3. 4. 2020   #8
-
0
-

V souvislosti s lokálními dočasnými tabulkami jsem narazil na jednu nepříjemnost.  Při vytváření pomocí SELECT - INTO dotazem s parametry se pro vytvoření tabulky používá uložená procedura což vede k "jepičímu" životu dočasné tabulky (zanikne při ukončení uložené procedury). Tato skutečnost dává problému nový rozměr. Žádám  Vás o názory na možná řešení:

1. Vytvoření dočasné tabulky tak jak jsem zmínil v úvodním příspěvku. To znamená místo parametrů vložit datum a čas (v klazuli between je v ukázce napevno) do query přímo. Vzhledem k tomu, že volající C# aplikace k jejich uložení používá DateTime, nemyslím, že by to představovalo nějaké riziko.

2. "Bramboračka" zmiňovaná v #5. Zde by použití parametrů nebyl problém. Dotaz vypadá příšerně a jeho dynamické sestavení kvůli proměnlivému počtu sloupců ve výsledném recordsetu nebude o nic lepší.

3. Rozdělení logiky na část vykonanou v databázi = získání recordsetu, který se pak uloží do DataTable v aplikaci (náhrada dočasné tabulky) a část vykonanou na straně aplikace = výběr (metodou DataTable.Select) hodnot z požadovaným časovým rozestupem.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:adfa:60d6:da9e:4a5d...–
MilanL+1
Expert
3. 4. 2020   #9
-
0
-

#8 hlucheucho
jde o to jak často tu teplotu snímáš 1/s a jak velké časové úseky bys dělal, na krátké úseky může být výhodný 3 způsob na delší úseky bude rychlejší zpracování na DB stroji, pokud ten jeden obsah využiješ víckrát, uvažoval bych o trvalé pracovní tabulce v DB, jen bys jí vyčistil při ukončení programu a před novým použitím.

Nahlásit jako SPAM
IP: 185.112.167.–
4. 4. 2020   #10
-
0
-

Vzorkování ADC je 1 sps. Jedno měření může trvat několik hodin i několik dní. Má s tím pracovat více uživatelů. U trvalé tabulky by se muselo řešit vytváření unikátních názvů. S lokální dočasnou tabulkou tento problém nevzniká.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:e471:4358:d100:8b4f...–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032020 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý