2008-09-17 11 views

Odpowiedz

9

Można sortować kolumny w malejącym formatu, a następnie po prostu uzyskać wartość od n-tego rzędu.

EDIT ::

Updated zgodnie komentarz życzenie. OSTRZEŻENIE całkowicie nietestowany!

SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6 

Coś jak wyżej powinno zadziałać dla Oracle ... może będziesz musiał najpierw uzyskać odpowiednią składnię!

+0

Czy możesz podać fragment kodu? Próbowałem twojej sugestii, ale nie byłem w stanie uzyskać wartości z n-tego rzędu. –

+0

Używanie 'ROWID' nie jest ani bezpiecznym ani praktycznym rozwiązaniem. Weź przykład z: [tag: sqlite]. 'ROWID' może, ale nie musi być generowany szeregowo.Ponadto kolejność 'ROWID' może nie być zgodna z kolejnością żądanej kolumny. – Quirk

5

Nie określić, które bazy danych, na MySQL można zrobić

SELECT column FROM table ORDER BY column DESC LIMIT 7,10; 

Lepiej pominąć pierwsze 7, a następnie dostać się następny dziesięć najwyższych.

+0

Jeśli używasz mysql, to przyda się w wyroczni (lub mssql wierzę) –

+0

Dobra rada, wyjaśniłem to – Pieter

0

W SQL Server, po prostu zrobić:

select distinct top n+1 column from table order by column desc 

A potem wyrzucić pierwszą wartość, jeśli nie jest to potrzebne.

3

Znowu może trzeba ustalić dla bazy danych, ale jeśli chcesz górną 2nd wartość w zbiorze danych, które potencjalnie ma wartość powielane, będziemy chcieli zrobić grupę, a także:

SELECT column 
FROM table 
WHERE column IS NOT NULL 
GROUP BY column 
ORDER BY column DESC 
LIMIT 5 OFFSET 2; 

Pominęłbym pierwsze dwa, a następnie dostanę kolejne pięć najwyższych.

4

Czysty SQL (uwaga: polecam używanie funkcji SQL specyficznych dla twojego DBMS, ponieważ prawdopodobnie będzie bardziej wydajny). To da ci n + 1 największą wartość (aby uzyskać najmniejszy, odwróć <). Jeśli masz duplikaty, ustaw go na COUNT (DISTINCT VALUE).

select id from table order by id desc limit 4 ; 
+------+ 
| id | 
+------+ 
| 2211 | 
| 2210 | 
| 2209 | 
| 2208 | 
+------+ 


SELECT yourvalue 
    FROM yourtable t1 
WHERE EXISTS(SELECT COUNT(*) 
       FROM yourtable t2 
       WHERE t1.id  <> t2.id 
        AND t1.yourvalue < t2.yourvalue 
       HAVING COUNT(*) = 3) 


+------+ 
| id | 
+------+ 
| 2208 | 
+------+ 
1

Oto metoda dla Oracle. Ten przykład otrzymuje 9. najwyższą wartość. Po prostu zamień 9 na zmienną związaną z pozycją, której szukasz.

select created from (
    select created from (
     select created from user_objects 
     order by created desc 
     ) 
     where rownum <= 9 
     order by created asc 
    ) 
    where rownum = 1 

Jeśli chcesz n-tą unikalną wartość, dodaj DISTINCT do najbardziej wewnętrznego bloku zapytań.

0

dla SQL 2005:

SELECT col1 from 
    (select col1, dense_rank(col1) over (order by col1 desc) ranking 
    from t1) subq where ranking between 2 and @n 
0

Kolejny Oracle z wykorzystaniem funkcji analitycznych:

select distinct col1 --distinct is required to remove matching value of column 
from 
(select col1, dense_rank() over (order by col1 desc) rnk 
    from tbl 
) 
where rnk = :b1 
0

Wystarczy wykopane na to pytanie, patrząc na odpowiedź siebie, a to wydaje się działać dla SQL Server 2005 (otrzymany z Blorgbeard's solution)

SELECT MIN(q.col1) FROM (
    SELECT 
     DISTINCT TOP n col1 
     FROM myTable 
     ORDER BY col1 DESC 
) q; 

efektywny, to jest SELECT MIN(q.someCol) FROM someTable q, z górną n tabeli uzyskanej przez zapytanie SELECT DISTINCT....

22

Rozważ poniższą tabelę pracowników z jedną kolumną na wynagrodzenia.

 
+------+ 
| Sal | 
+------+ 
| 3500 | 
| 2500 | 
| 2500 | 
| 5500 | 
| 7500 | 
+------+ 

Następujące zapytanie zwróci element Nth Maximum.

select SAL from EMPLOYEE E1 where 
(N - 1) = (select count(distinct(SAL)) 
      from EMPLOYEE E2 
      where E2.SAL > E1.SAL) 

Na przykład. gdy wymagana jest druga wartość maksymalna,

select SAL from EMPLOYEE E1 where 
    (2 - 1) = (select count(distinct(SAL)) 
       from EMPLOYEE E2 
       where E2.SAL > E1.SAL) 
 
+------+ 
| Sal | 
+------+ 
| 5500 | 
+------+ 
+2

Łatwe rozwiązanie działa na wszystkich bazach danych! Ładne myślenie! :) – Sterex

+0

Świetna odpowiedź! Napotkałem ten problem wcześniej i martwiłem się, jak go rozwiązać, nie będąc specyficznym dla dostawcy :) Jedną z możliwych wad jest to, że wykonuje podzapytanie dla każdego wiersza. – gaboroncancio

+0

To jest niesamowite! Używam go z operatorem '> =', aby uzyskać wszystkie wiersze z pozycją do N. Chciałbym dodać do niego ranking, np. "1" dla wartości maksymalnej, "2" dla drugiego maksimum, itd. Czy masz pojęcie, jak sobie z tym poradzić? – NurShomik

0
select sal,ename from emp e where 
2=(select count(distinct sal) from emp where e.sal<=emp.sal) or 
3=(select count(distinct sal) from emp where e.sal<=emp.sal) or 
4=(select count(distinct sal) from emp where e.sal<=emp.sal) order by sal desc; 
1
Select max(sal) 
from table t1 
where N (select max(sal) 
     from table t2 
     where t2.sal > t1.sal) 

Aby znaleźć nta max Sal.

1
SELECT * FROM tablename 
WHERE columnname<(select max(columnname) from tablename) 
order by columnname desc limit 1 
0

MySQL:

select distinct(salary) from employee order by salary desc limit (n-1), 1; 
-1

pracownik Tabela

salary 
1256 
1256 
2563 
8546 
5645 

znaleźć drugą wartość max przez tego zapytania

select salary 
from employee 
where salary=(select max(salary) 
       from employee 
       where salary <(select max(salary) from employee)); 

znaleźć trzecią wartość max o tego zapytania

select salary 
from employee 
where salary=(select max(salary) 
       from employee 
       where salary <(select max(salary) 
           from employee 
           where salary <(select max(salary)from employee))); 
+0

Zewnętrzne wybory są obce. Zatrzymanie przy pierwszym maksimum (wynagrodzenie) by zadziałało. – RichardTheKiwi

+0

To jest orzechowe rozwiązanie. –

0

Odpowiedź: top sekund:

select * from (select * from deletetable where rownum <=2 order by rownum desc) where rownum <=1 
+1

Jeśli nie dodasz czegoś nowego, nie odpowiadaj na pytania 4-letnie :) – fancyPants

3

(tabela Name = Student, Column Name = mark)

select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4 
+0

Serwer MS SQL [numer_wiersza] (https://msdn.microsoft.com/en-us/library/ms186734.aspx) – woodvi

0

(TableName = Student, NazwaKolumny = Mark):

select * 
from student 
where mark=(select mark 
      from(select row_number() over (order by mark desc) as t, 
       mark 
       from student group by mark) as td 
      where t=2) 
2

Możesz znaleźć n-tą największą wartość kolumny za pomocą Zapytanie llowing:

SELECT * FROM TableName a WHERE 
    n = (SELECT count(DISTINCT(b.ColumnName)) 
    FROM TableName b WHERE a.ColumnName <=b.ColumnName); 
0

Myślę, że poniższe zapytanie będzie działać po prostu idealne na Oracle SQL ... Ja testowałem to sam ..

informacji związanych z tym zapytaniem: ta kwerenda jest za pomocą dwóch tabel nazwanych employee i department z kolumn w pracownika nazwanych: name (nazwisko pracownika), dept_id (wspólnej dla pracownika i wydziału), salary

i kolumn w tabeli dział: dept_id (wspólne dla pracownika, jak również tabeli), dept_name

SELECT 
    tab.dept_name,MIN(tab.salary) AS Second_Max_Sal FROM (
    SELECT e.name, e.salary, d.dept_name, dense_rank() over (partition BY d.dept_name   ORDER BY e.salary) AS rank FROM department d JOIN employee e USING (dept_id)) tab 
WHERE 
    rank BETWEEN 1 AND 2 
GROUP BY 
    tab.dept_name 

dzięki

0
Select min(fee) 
from fl_FLFee 
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc) 

Zmień Numer cztery z N.

0

można uprościć jak ten

SELECT MIN(Sal) FROM TableName 
WHERE Sal IN 
(SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC) 

Jeśli Sal zawiera zduplikowane wartości, a następnie skorzystać z tej

SELECT MIN(Sal) FROM TableName 
WHERE Sal IN 
(SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC) 

4 będzie wartość n-ty może ona żadnego najwyższej wartości, takich jak 5 lub 6 itd.

1

to zapytanie do coraz nth najwyższa z colomn umieścić n = 0 na drugi najwyższy i n = 1 dla 3-te najwyższy i tak dalej ...

SELECT * FROM TableName 
WHERE ColomnName<(select max(ColomnName) from TableName)-n order by ColomnName desc limit 1; 
0

Proste zapytań SQL w celu uzyskania szczegółów pracownika, który jest n-MAX Salary w tabeli Employee.

sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>; 

rozważyć struktury tabeli jako:

pracownika ( id [Int klucz podstawowy auto_increment], nazwa [varchar (30)], płaca [int]);

Przykład:

Jeśli potrzebujesz 3rd MAX wynagrodzenie w powyższej tabeli wtedy, zapytanie będzie:

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2; 

Podobnie:

Jeśli potrzebujesz 8-ci MAX wynagrodzenie w powyższej tabeli, zapytanie będzie:

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7; 

UWAGA: Kiedy trzeba uzyskać PnMAX wartość należy podać OFFSET jako (n - 1).

W ten sposób można wykonać ten sam rodzaj operacji w przypadku wynagrodzenia w porządku rosnącym.

1
select column_name from table_name 
    ordered by column_name desc limit n-1,1; 

gdzie n = 1, 2, 3, .... n-ta wartość maksymalna.

+0

przegłosowano za sugerowanie składni limitu przecinków. –

0

W PostgreSQL, aby znaleźć N-tego największego wynagrodzenia z tabeli pracownika.

Powiązane problemy