Wie finde third or nth
ich das maximale Gehalt aus dem Gehalt table(EmpID,EmpName,EmpSalary)
auf optimierte Weise?
Wie finde third or nth
ich das maximale Gehalt aus dem Gehalt table(EmpID,EmpName,EmpSalary)
auf optimierte Weise?
Antworten:
Verwenden Sie ROW_NUMBER
(wenn Sie eine einzelne möchten) oder DENSE_RANK
(für alle zugehörigen Zeilen):
WITH CTE AS
(
SELECT EmpID, EmpName, EmpSalary,
RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow
EmpSalary
Spalte. Auch reduziert im Vergleich zu was? Der Vorteil des ROW_NUMBER
Ansatzes ist, dass Sie verwenden können ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Sie können es also verwenden, um Gruppen abzurufen und trotzdem auf eine beliebige Spalte davon zuzugreifen.
Zeilennummer :
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As RowNum
FROM EMPLOYEE
) As A
WHERE A.RowNum IN (2,3)
Unterabfrage:
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary
)
Top Keyword:
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC
) a
ORDER BY salary
... WHERE (N-1) = (Subquery)...
funktioniert. Die Unterabfrage ist eine korrelierte Abfrage, da ihre WHERE
Klausel die Emp1
Hauptabfrage verwendet. Die Unterabfrage wird jedes Mal ausgewertet, wenn die Hauptabfrage eine Zeile durchsucht. Wenn wir beispielsweise das drittgrößte Gehalt (N = 3) aus (800, 1000, 700, 750) ermitteln möchten, wäre die Unterabfrage für die 1. Zeile SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0. Für das 4. Gehalt ist der Wert (750) ... WHERE Emp2.Salary > 750
2 oder N. -1, daher wird diese Zeile zurückgegeben.
Wenn Sie den Weg optimieren möchten, müssen Sie das TOP
Schlüsselwort verwenden. Die Abfrage des n-ten maximalen und minimalen Gehalts lautet also wie folgt: Die Abfragen sehen jedoch in umgekehrter Reihenfolge schwierig aus, wenn Sie aggregierte Funktionsnamen verwenden:
N maximales Gehalt:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)
zum Beispiel: 3 maximales Gehalt:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
N Mindestgehalt:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)
zum Beispiel: 3 Mindestgehalt:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Zu einfach, wenn Sie die Unterabfrage verwenden!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
Sie können hier einfach den n-ten Wert nach der LIMIT-Einschränkung ändern.
Hier in dieser Unterabfrage Wählen Sie EmpSalary aus der Mitarbeiterreihenfolge nach EmpSalary DESC Limit 3 aus. würde die Top 3 Gehälter der Mitarbeiter zurückgeben. Aus dem Ergebnis wählen wir das Mindestgehalt mit dem Befehl MIN aus, um das 3. TOP-Gehalt des Mitarbeiters zu erhalten.
Ersetzen Sie N durch Ihre maximale Anzahl
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Erläuterung
Die obige Abfrage kann ziemlich verwirrend sein, wenn Sie so etwas noch nicht gesehen haben. Die innere Abfrage wird als korrelierte Unterabfrage bezeichnet, da die innere Abfrage (die Unterabfrage) einen Wert aus der äußeren Abfrage (in diesem Fall die Emp1-Tabelle) verwendet ) in der WHERE-Klausel.
Und Quelle
... WHERE (N-1) = (Subquery)...
funktioniert. Die Unterabfrage ist eine korrelierte Abfrage, da ihre WHERE
Klausel die Emp1
Hauptabfrage verwendet. Die Unterabfrage wird jedes Mal ausgewertet, wenn die Hauptabfrage eine Zeile durchsucht. Wenn wir beispielsweise das drittgrößte Gehalt (N = 3) aus (800, 1000, 700, 750) ermitteln möchten, wäre die Unterabfrage für die 1. Zeile SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0. Für das 4. Gehalt ist der Wert (750) ... WHERE Emp2.Salary > 750
2 oder N. -1, daher wird diese Zeile zurückgegeben.
Drittes oder n-te maximales Gehalt aus der Gehaltstabelle ohne Unterabfrage
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
Für das dritthöchste Gehalt setzen Sie 2 anstelle von N-1
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
Beziehen Sie sich auf die folgende Abfrage, um das n-te höchste Gehalt zu erhalten. Auf diese Weise erhalten Sie das n-te höchste Gehalt in MYSQL. Wenn Sie nur das n-te niedrigste Gehalt erhalten möchten, müssen Sie DESC in der Abfrage durch ASC ersetzen.
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Methode 1:
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
Methode 2:
Select EmpName,salary from
(
select EmpName,salary ,Row_Number() over(order by salary desc) as rowid
from EmpTbl)
as a where rowid=3
Im Jahr 2008 können wir ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) verwenden, um einen Rang ohne Bindungen zu erhalten, die wir verwenden können.
Zum Beispiel können wir auf diese Weise die achthöchste erreichen oder @N in etwas anderes ändern oder es als Parameter in einer Funktion verwenden, wenn Sie möchten.
DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;
Wie Sie vielleicht wissen, wird dies in SQL Server 2012 mit LAG () intuitiver ausgeführt.
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
Dies ist eine der beliebtesten Fragen in jedem SQL-Interview. Ich werde verschiedene Abfragen aufschreiben, um den n-ten höchsten Wert einer Spalte herauszufinden.
Ich habe eine Tabelle mit dem Namen "Emloyee" erstellt, indem ich das folgende Skript ausgeführt habe.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
Jetzt werde ich 8 Zeilen in diese Tabelle einfügen, indem ich die Anweisung insert ausführe.
insert into Employee values(1,'Neeraj',45000)
insert into Employee values(2,'Ankit',5000)
insert into Employee values(3,'Akshay',6000)
insert into Employee values(4,'Ramesh',7600)
insert into Employee values(5,'Vikas',4000)
insert into Employee values(7,'Neha',8500)
insert into Employee values(8,'Shivika',4500)
insert into Employee values(9,'Tarun',9500)
Jetzt werden wir den dritthöchsten Basic_sal aus der obigen Tabelle mit verschiedenen Abfragen herausfinden. Ich habe die folgende Abfrage in Management Studio ausgeführt und unten ist das Ergebnis.
select * from Employee order by Basic_Sal desc
Wir können im obigen Bild sehen, dass das dritthöchste Grundgehalt 8500 betragen würde. Ich schreibe 3 verschiedene Arten, dasselbe zu tun. Wenn Sie alle drei unten genannten Abfragen ausführen, erhalten Sie das gleiche Ergebnis, dh 8500.
Erster Weg: - Verwenden der Zeilennummernfunktion
select Ename,Basic_sal
from(
select Ename,Basic_Sal,ROW_NUMBER() over (order by Basic_Sal desc) as rowid from Employee
)A
where rowid=2
Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;
Ich zeige das dritthöchste Gehalt
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
Optimierte Methode: Verwenden Sie anstelle der Unterabfrage nur limit.
select distinct salary from employee order by salary desc limit nth, 1;
Siehe Limit-Syntax hier http://www.mysqltutorial.org/mysql-limit.aspx
Um den dritthöchsten Wert aus der Tabelle zu erhalten
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Durch Unterabfrage:
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Versuchen Sie diese Abfrage
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
Setzen Sie n = den gewünschten Wert
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Versuchen Sie diesen Code: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
select * from employee order by salary desc;
+------+------+------+-----------+
| id | name | age | salary |
+------+------+------+-----------+
| 5 | AJ | 20 | 100000.00 |
| 4 | Ajay | 25 | 80000.00 |
| 2 | ASM | 28 | 50000.00 |
| 3 | AM | 22 | 50000.00 |
| 1 | AJ | 24 | 30000.00 |
| 6 | Riu | 20 | 20000.00 |
+------+------+------+-----------+
select distinct salary from employee e1 where (n) = (select count( distinct(salary) ) from employee e2 where e1.salary<=e2.salary);
Ersetzen Sie n durch das n-te höchste Gehalt als Zahl.
Probier diese...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
SELECT * FROM (wählen Sie ein unterschiedliches Gehalt aus der Kundenbestellung nach Gehalt DESC) Limit 4,1;
Limit 4,1 bedeutet, dass Sie die ersten 4 Zeilen verlassen und dann die nächste auswählen.
Limit und Rownumber hängen von der verwendeten Plattform ab.
Versuchen Sie dies, es wird funktionieren.
HINWEIS: Bitte ersetzen Sie OFFSET 3 in Query durch eine beliebige n- te Ganzzahl
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
Beschreibung
NUR DIE NÄCHSTEN 1 REIHEN ERHALTEN
Geben Sie nur 1 Zeile zurück
OFFSET 3 REIHEN
erste 3 Datensätze ausschließen Hier können Sie eine beliebige Ganzzahl eingeben
Unterabfragen brauchen immer mehr Zeit:
Verwenden Sie die folgende Abfrage, um die höchsten und niedrigsten Daten zu erhalten:
Höchste Daten: select *from business order by id desc limit 3,1;
Niedrigste Daten: select *from business order by id asc limit 3,1;
Kann N anstelle von 3 verwenden, um n-te Daten zu erhalten.