Loading...
mgulubov avatar mgulubov 73 Точки

[Homework] Data Aggregation - 17. 3rd Highest Salary

Привет,

 

Пъна се като теле на мост от два дена с тази задача и не мога да разбера защо не ми дава верен резултат в judge :).

Следната заявка би трябвало да е правилна:

WITH
    DepartmentIdSalaryRows
AS
(
    SELECT
        e.DepartmentID,
        e.Salary,
        ROW_NUMBER() OVER(PARTITION BY e.DepartmentID ORDER BY e.Salary DESC) AS RowNumber
    FROM
        Employees e
)

SELECT
    di.DepartmentID,
    di.Salary AS ThirdHighestSalary
from
    DepartmentIdSalaryRows di
where
    RowNumber = 3

 

Пробвах всякакви вариации с имената на колоните, преправих заявката да показва NULL за отдела, за който няма RowNumber 3 и не става и не става.

Гледам, че има няколко човека, на които им е дало точки, та ако може да споделят какво не правя като хората.

Тагове:
1
Databases Basics
ArmenPotourlyan+deleted! avatar ArmenPotourlyan+deleted! 488 Точки
Best Answer

Проблемът ти идва от това, че има повтарящи се стойности на заплатите. Например ако имаш следните заплати:

1) 1000.00 $
2) 999.00 $
2) 999.00 $
2) 999.00 $
3) 888.00 $

Твоята заявка дава отговор 999.00 $, а реално третата най-висока по стойност заплата е 888.00 $

Вместо ROW_NUMBER() пробвай с RANK() - MSDN

EDIT: Пардон не RANK(), а DENSE_RANK() - MSDN

 

4
29/09/2016 11:02:38
mgulubov avatar mgulubov 73 Точки

Хубаво предложение, ще го тествам :).

Става и по сложния начин - с още едно cte, в което да има distinct DepartmentId и Salary.

2
RFilipov avatar RFilipov 136 Точки

Друг вариант:

USE Softuni
SELECT DepartmentID, 
	(SELECT DISTINCT Salary FROM Employees WHERE DepartmentID = e.DepartmentID ORDER BY Salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY)AS ThirdHighestSalary
FROM Employees e
WHERE (SELECT DISTINCT Salary FROM Employees WHERE DepartmentID = e.DepartmentID ORDER BY Salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY) IS NOT NULL
GROUP BY DepartmentID

 

3
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.