2014-10-05 2 views
0

В книге «SQL for Smarties» приведен пример кода для вычисления первой медианной даты.Дата первого медиана по SQL

Здесь я приведу пример. http://sqlfiddle.com/#!3/c69520/1

---duplicate to ensure even number of rows 

CREATE VIEW Temp1 
AS SELECT weight FROM Parts 
UNION ALL 
SELECT weight FROM Parts; 

---below this part is what I didn't understand how it works 

CREATE VIEW Temp2 
AS SELECT weight 
FROM Temp1 
WHERE 
(SELECT COUNT(*) FROM Parts) 
<= (SELECT COUNT(*) 
FROM Temp1 AS T1 
WHERE T1.weight >= Temp1.weight) 
AND (SELECT COUNT(*) FROM Parts) 
<= (SELECT COUNT(*) 
FROM Temp1 AS T2 
WHERE T2.weight <= Temp1.weight); 

SELECT AVG(DISTINCT weight) AS median 
FROM Temp2; 

Результат является правильным, хотя это решение является дорогостоящим с точки зрения времени и хранения.

Действительно стремится узнать, как эта часть работает?

Я попытался увидеть результат внутреннего оператора SQL.

(SELECT COUNT(*) 
FROM Temp1 AS T1 
WHERE T1.weight >= Temp1.weight) 

И получил сообщение

Идентификатор нескольких частей «Temp1.weight» не могут быть связаны.

Как понять этот SQL?

+0

Это называется «коррелированным подзапросом» (вы можете посмотреть это). Существуют и другие способы расчета медианы. –

ответ

0
CREATE VIEW Temp2 
AS SELECT weight 
FROM Temp1 
WHERE 
    (SELECT COUNT(*) FROM Parts) <= (SELECT COUNT(*) 
             FROM Temp1 AS T1 
             WHERE T1.weight >= Temp1.weight 
            ) 
AND 
    (SELECT COUNT(*) FROM Parts) <= (SELECT COUNT(*) 
            FROM Temp1 AS T2 
            WHERE T2.weight <= Temp1.weight 
           ); 

Возможно, вы имеете в виду в приведенном выше коде. Я сделал что-то переформатированное, сделав его немного яснее (по крайней мере для меня). В подзапросе вы переопределяете имя Temp1-T1. Значение в подзапросе, когда вы говорите t1.weight, вы ссылаетесь на столбец веса подзапросов. Но Temp1.weight будет родительским запросом таблицы Temp1. Это означает, что для каждой строки в таблице Temp1 он будет выполнять новый запрос, просматривающий все строки Temp1 и проверять текущее значение строк. Таким образом, 10 строк будут похожи на 200 строк, а затем, конечно, с правильными индексами, и так далее фактическая строка будет не так плоха.

Причина вы получаете

Мульти-часть идентификатора "Temp1.weight" не могут быть связаны.

Это потому, что вы пытаетесь запустить внутренний запрос без внешнего запроса, поэтому сервер не имеет понятия, что вы подразумеваете под Temp1. Он знает только о T1.

 Смежные вопросы

  • Нет связанных вопросов^_^