2016-12-13 5 views
-2

У меня есть таблица с двумя столбцамиИспользование агрегатной функции с арифметической операции

enter image description here

Здесь мне нужно найти SQL в соответствии со следующей функцией,

Z = accelx-AVG(accelx) for every rows. 
+2

и какой двигатель и версия базы данных вы используете ?. Какой код вы пробовали? – Lamak

ответ

0

Просто рассчитать AVG в подзапроса :

SELECT AccelX - (SELECT AVG(AccelX) FROM T) 
FROM T 
+0

Используйте оконную функцию. 'AVG (AccelX) OVER()' –

+0

@MatthewWhited Не у каждого db есть –

0

Попробуйте следующее:

select t1.accelx - t2.avgx as Z 
from TableName as t1 
inner join (
    select avg(accelx) as avgx 
    from TableName 
    ) as t2 
on 1 = 1 
+1

'on 1 = 1'? Это кросс-соединение, поэтому вы должны заменить 'inner join' на' cross join' и удалить необязательное предложение 'on'. –

0
SELECT t1.accelx - t2.avgx as Z, userName 
FROM TableName as t1 
JOIN (SELECT userName, avg(accelx) as avgx 
     FROM TableName 
     GROUP BY userName) as t2  
    ON t1.userName = t2.userName 
2

Это обычно делается с аналитической версии AVG:

select accelx - avg(accelx) over() 
from mytable; 
+0

Вы правы, но не у всех db есть. Я бы включил 'partition by userName' –

+0

Я бы тоже, если бы хотел среднего пользователя. Я не хочу, если это то, чего хочет OP, однако ;-) –

0

TSQL на MSSQL Server имеет WINDOWED функции. OVER Clause

SELECT 
    [AccelX] 
    ,[AccelX] - AVG([AccelX]) OVER() 
FROM T