Chcę znaleźć 2nd, 3rd..nth maksymalną wartość kolumnyZapytanie znaleźć n-tą wartość max kolumny
Odpowiedz
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ę!
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. –
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
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.
Jeśli używasz mysql, to przyda się w wyroczni (lub mssql wierzę) –
Dobra rada, wyjaśniłem to – Pieter
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.
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.
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 |
+------+
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ń.
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
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
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...
.
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 | +------+
Łatwe rozwiązanie działa na wszystkich bazach danych! Ładne myślenie! :) – Sterex
Ś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
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
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;
Select max(sal)
from table t1
where N (select max(sal)
from table t2
where t2.sal > t1.sal)
Aby znaleźć nta max Sal.
SELECT * FROM tablename
WHERE columnname<(select max(columnname) from tablename)
order by columnname desc limit 1
MySQL:
select distinct(salary) from employee order by salary desc limit (n-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)));
Zewnętrzne wybory są obce. Zatrzymanie przy pierwszym maksimum (wynagrodzenie) by zadziałało. – RichardTheKiwi
To jest orzechowe rozwiązanie. –
Odpowiedź: top sekund:
select * from (select * from deletetable where rownum <=2 order by rownum desc) where rownum <=1
Jeśli nie dodasz czegoś nowego, nie odpowiadaj na pytania 4-letnie :) – fancyPants
(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
Serwer MS SQL [numer_wiersza] (https://msdn.microsoft.com/en-us/library/ms186734.aspx) – woodvi
(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)
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);
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
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.
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.
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;
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ć Pn
MAX
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.
select column_name from table_name
ordered by column_name desc limit n-1,1;
gdzie n = 1, 2, 3, .... n-ta wartość maksymalna.
przegłosowano za sugerowanie składni limitu przecinków. –
W PostgreSQL, aby znaleźć N-tego największego wynagrodzenia z tabeli pracownika.
zbyt ogólna Myślę, że: należy określić co najmniej w którym DBMS ... – ila
Jaką bazę danych? Nie sądzę, że istnieje bardzo dobre "ogólne" rozwiązanie tego problemu. –