2014-02-19 4 views
1

Помогите, написав SQL-скрипт, который будет сортировать данные.
Ключевой трудностью - нужно создать дополнительный столбец, по которому будет происходить сортировка.
Я попытался описать ситуацию настолько подробно, насколько это возможно.
SQL-запрос с сортировкой

Давайте начнем. Существует таблица следующего вида:
datas
Мы получим идентификатор пользователя и возвращаем данные, только те, у кого его нет, но есть и другие.
Следующий шаг: сортировать по искусственно созданной колонке.

Далее я сделаю шаг за шагом.
Итак, что я могу сказать об искусственном столбе:
В этой колонке будет содержаться разница между оценками. Итак, чтобы получить его - вам нужно сначала выполнить ряд действий:
Согласно информации, которая подобна заданию пользователю и другому пользователю, чтобы рассчитать разницу в оценке и получить средний балл.
Следующие две фотографии показывают одни и те же данные, а затем сам расчет, мне кажется - это довольно просто.
enter image description here


Расчет этой колонки заключается в следующем:

User with 2nd id: 
1: 5 - 1 = 4; 
2: 2 - 9 = -7; 
3: next data what is in user 1 - absent in user 2, and we ease pass it; 
User with 3rd id: 
1: 3 - 1 = 2; 
2: the next data's is absent in user with 3rt id; 
3: 8 – 9 = -1; 
4: 6 – 2 = 4; 
5: passed; 

End in the end: 
User_2 will have new mark = -1.5 
User_3 will have new mark = 1.66666 

И в конце концов, мне нужно, чтобы вернуть таблицу: enter image description here
Но это еще не все. Часто данные будут дублироваться, и я бы хотел получить средние результаты по полученным данным. Пожалуйста, посмотрите на следующий пример:

enter image description here

И это конец. Мне действительно нужна ваша помощь, эксперты. Я сам преподаю код sql, но для меня это очень сложно.
Если бы идея сделать скрипт следующим образом:

SELECT d.data, (d.mark + myCount(d.user, 1)) newOrder 
FROM info d 
WHERE -- data from user_1 NOT equal data from other users 
ORDER BY newOrder; 

Но сценарий будет выполняться много времени, потому что она использует свою собственную функцию, которая может сделать с запросом к каждому пользователю, а не запись. Надеюсь, кто-то сможет справиться с этой задачей.

ответ

1

После ваших шагов:

Во-первых, нам нужно изолировать данные от выбранного пользователя (допустим, это 1):

CREATE TEMP TABLE sel_user AS 
SELECT data, mark FROM info d WHERE user = 1; 

Теперь вычислим метку для каждого пользователя (опять , выбранный пользователь 1):

SELECT d.user user, d.mark - s.mark mark 
FROM info d JOIN sel_user s USING (data) 
WHERE d.user <> 1; 

Результат:

user  mark  
---------- ---------- 
2   4   
2   -7   
3   2   
3   -1   
3   4   

Мы можем запросить только среднее:

SELECT d.user user, AVG(d.mark - s.mark) mark 
FROM info d JOIN sel_user s USING (data) 
WHERE d.user <> 1 GROUP BY user; 

user  mark  
---------- ---------- 
2   -1.5  
3   1.66666666 

Но вы все еще хотите сделать расчеты с метками, которые не соответствуют пользователю 1:

SELECT d.user user, mark FROM info d 
WHERE d.user <> 1 AND d.data NOT IN (SELECT data FROM sel_user); 
user  mark  
---------- ---------- 
2   4   
3   3   
3   10 

В частности, вы хотите добавить ранее рассчитывается среднее для каждой строки:

SELECT d.user user, d.data, d.mark + d2.mark AS neworder FROM info d JOIN (
    SELECT d.user user, AVG(d.mark - s.mark) mark 
    FROM info d JOIN sel_user s USING (data) 
    WHERE d.user <> 1 GROUP BY user 
) d2 USING (user) 
WHERE d.data NOT IN (SELECT data FROM sel_user) 
ORDER BY neworder DESC; 
user  data  neworder   
---------- ---------- ---------------- 
3   6   11.6666666666667 
3   3   4.66666666666667 
2   5   2.5    

И ваш последний запрос, чтобы получить среднее значение для каждого data:

SELECT data, AVG(neworder) final FROM (
    SELECT d.user user, d.data, d.mark + d2.mark AS neworder FROM info d JOIN (
     SELECT d.user user, AVG(d.mark - s.mark) mark 
     FROM info d JOIN sel_user s USING (data) 
     WHERE d.user <> 1 GROUP BY user 
    ) d2 USING (user) 
    WHERE d.data NOT IN (SELECT data FROM sel_user) 
) 
GROUP BY data 
ORDER BY final DESC; 
data  final   
---------- ---------------- 
6   11.6666666666667 
3   4.66666666666667 
5   2.5  
+0

Подобный подход к моим мыслям, но я делал это с принципом самосоединения. – DRapp

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