Black friday Black friday
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Avatar
Hojdar Vít
Člen
Avatar
Hojdar Vít:18.12.2018 22:40

Vypsat pomocí SQL dotazu JEN druhý (a tedy i jaýkoliv následující n-tý) řádek splňující zadanou podmínku.
Umím si vypsat počet řádků splňující podmínku. Umím si vypsat všechny řádky splňující podmínku. Ale jak vypsat samostatně AŽ DRUHÝ řádek splňující podmínku? Existuje vůbec takováto možnost?

Zkusil jsem: google... ale nepomáhá.

 
Odpovědět 18.12.2018 22:40
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:19.12.2018 7:53

V mysql se pouziva LIMIT. Jinak, radky si muzes ocislovat. Netusim, jak v jinych db

SELECT sloupce FROM tabulka WHERE podminky ORDER BY sloupce ASC/DESC LIMIT od_radku,pocet -- LIMIT 2 je od radku 2

Pokud bys chtel sude, liche radky, pak bys to musel pridat jako dalsi podminku. V zavorce je pak tabulka z jineho dotazu. Mozna ji bude treba dat alias "...FROM (SELECT... ) tab1 WHERE..."

SELECT ... FROM (SELECT ..., COUNT(*) AS cislo_radku... ORDER BY ...) WHERE cislo_radku>2
SELECT ... FROM (SELECT ..., COUNT(*)%2 AS sude... ORDER BY ...) WHERE sude==0

(ale mozna, ze na to existuje v pozadovanem sql jiny jednodussi prikaz)

 
Nahoru Odpovědět 19.12.2018 7:53
Avatar
Hojdar Vít
Člen
Avatar
Odpovídá na Peter Mlich
Hojdar Vít:19.12.2018 21:18

Tak jsem to zkoušel a bohužel na moji databázi to nefunguje. Dotazuji se do access databáze a ta (jak jsem se krkolomně přes googlování ´LIMIT´u dozvěděl) má obdobu v ´SELECT TOP´, jenže tento příkaz vybere všechny řádky od prvního nalezeného (až do zadaného), nikoliv AŽ určitý n-řádek :-(
Jdu hledat alternativu.

 
Nahoru Odpovědět 19.12.2018 21:18
Avatar
dez1nd
Člen
Avatar
Odpovídá na Hojdar Vít
dez1nd:20.12.2018 5:49
SELECT
  ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
  name
FROM table
WHERE row > 1;

zkus tohle

 
Nahoru Odpovědět 20.12.2018 5:49
Avatar
dez1nd
Člen
Avatar
Odpovídá na dez1nd
dez1nd:20.12.2018 6:03

Omlouvám se tohle je správná varianta, protože do WHERE funkcni ani alias nedáš.

SELECT t.*
FROM
(SELECT ROW_NUMBER() OVER(id) as row, id, nazev
FROM tabulka) t
WHERE t.row => 2
Editováno 20.12.2018 6:04
 
Nahoru Odpovědět 20.12.2018 6:03
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.12.2018 7:44

google = ms sql limit
ms sql 2005

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 10 AND 20;

ms sql 2012

USE AdventureWorks; -- mozna staci bez tohoto
GO -- a tohoto
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
ORDER BY SalesOrderID
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY;
GO -- a tohoto

ms sql 2000

SELECT t1.*
FROM (
    SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
    FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @[email protected]count;

ms sql 2012

SELECT *
FROM table1
ORDER BY columnName
  OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

---

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

This can be translated into Microsoft SQL Server like

SELECT * FROM
(
    SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum
    FROM table
) a
WHERE rnum > OFFSET

---

CREATE VIEW v_table AS
    SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table
SELECT * FROM v_table WHERE row BETWEEN 10 AND 20

V mysql je to LIMIT 20 let, minimalne, stale :)

Editováno 20.12.2018 7:46
 
Nahoru Odpovědět 20.12.2018 7:44
Avatar
Odpovídá na Hojdar Vít
Michal Štěpánek:20.12.2018 8:44

zkus se mrknout tady, třeba ti to pomůže
https://devask.cz/…uery-results

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 20.12.2018 8:44
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
dez1nd
Člen
Avatar
dez1nd:20.12.2018 11:35

nestačila by třeba kombinace OFFSET a LIMITu ?

 
Nahoru Odpovědět 20.12.2018 11:35
Avatar
Hojdar Vít
Člen
Avatar
Hojdar Vít:22.12.2018 21:11

Tak po dlouhém snažení a postupným zkoušením navržených možností, kdy v dotazech nefungoval (databáze (MS 2007) stále házela chybu) pro LIMIT i OFFSET i GO ... jsem nakonec ve chvíli náhlého impozantního myšlení vymyslel jak můj problém vyřešit...
prakticky jde jen o využití základních ORDER BY a TOP, kdy jednou seřadím výběr od konce (DESC) a udělám TOP o jeden řádek méně, abych následně vše seřadil ASC a vybral první řádek (tedy prakticky druhý ve výběru)...
lépěji v kódu kde x=počet řádků (což lze samozřejmě zjistit jednoduchým dotazem) ...

SELECT TOP 1 DatumKontroly
FROM (
   SELECT TOP (x-1) DatumKontroly
   FROM Kontroly
   WHERE IDzaznamKontroly = 420
   ORDER BY DatumKontroly DESC)
ORDER BY DatumKontroly ASC;

No akorátže jsem nakonec zjistil, že mi tuto možnost prakticky nabídl Michal Štěpánek pod svým odkazem, takže si nejsem jist, jestli jsem řešení zvládl v rámci svého osvícení, nebo prvotním nepochopením odkazovaného Michalova kódu :-D

samozřejmě

(x-1)

ošetřím v kódu programu, nikoliv v kódu dotazu.

 
Nahoru Odpovědět 22.12.2018 21:11
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.