Преобразование данных в десятые доли и усреднение значений - PullRequest
0 голосов
/ 28 мая 2020

итак, у меня есть таблица в тысячных долях мили, например:

id |fk |from  |to    |speed|score  
1  |123|10.002|10.003|20   |10  
2  |123|10.003|10.004|25   |11  
3  |123|10.004|10.005|40   |44  
4  |123|10.005|10.006|50   |23  
5  |123|10.006|10.007|20   |54  
6  |123|10.007|10.008|10   |24  
7  |123|10.008|10.009|65   |24  
8  |123|10.009|10.010|23   |24  
9  |123|10.010|10.011|74   |56  
10 |123|10.011|10.012|25   |43  
11 |123|10.012|10.013|10   |76  
12 |123|10.013|10.014|5    |10  
...

Мне нужно преобразовать таблицу тысячных миль в десятые доли мили и взять среднее значение скорости и счет вот так:

id |fk |from  |to    |Avgspeed|Avgscore  
1  |123|10.002|10.012|35.2    |31.3  
10 |123|10.012|...   |...     |...  

Я придумал этот запрос, чтобы получить десятую часть мили:

select CASE WHEN rn=1 then 1
when rn%10=0 then 1
else 0 end chk,x.* from 
(
select row_number() over (partition by fk order by fk,from) rn,* from dbo.Thous_Data
)x 

Это дает мне

id |fk |from  |to    |speed|score|chk|rn  
1  |123|10.002|10.003|20   |10   |1  |1  
2  |123|10.003|10.004|25   |11   |0  |2  
3  |123|10.004|10.005|40   |44   |0  |3   
4  |123|10.005|10.006|50   |23   |0  |4  
5  |123|10.006|10.007|20   |54   |0  |5  
6  |123|10.007|10.008|10   |24   |0  |6  
7  |123|10.008|10.009|65   |24   |0  |7  
8  |123|10.009|10.010|23   |24   |0  |8  
9  |123|10.010|10.011|74   |56   |0  |9  
10 |123|10.011|10.012|25   |43   |1  |10  
11 |123|10.012|10.013|10   |76   |0  |11  
12 |123|10.013|10.014|5    |10   |0  |12  
...  

Не уверен как приступить к получению средних значений и правильной настройке от и до. Любые идеи приветствуются.

Ответы [ 2 ]

0 голосов
/ 01 июня 2020

Я смог это сделать, начав счет с 0, чтобы скобки были точными:

with cte as
(select CASE WHEN rn=0 then 1
when rn%10=0 then 1
else 0 end chk,x.*
from 
(
select ROW_NUMBER() over (partition by fk order by fk,from)-1 rn,* from dbo.Thous_Data 
)x

)
,cte2 as(
SELECT
      distinct fk,to,from,
       SUM([Chk]) OVER (PARTITION BY  fk ORDER BY  to,from) AS Groups

    FROM cte    

)

    Select distinct fk,
        Min(from) over (partition by fk,groups) from_
,Max(to) over (partition by fk,groups) to_
,avg(speed) over (partition by fk,groups) Aspeed
,avg(score) over (partition by fk,groups) Ascore

from
cte2
0 голосов
/ 28 мая 2020

Что-то вроде этого?

SELECT 10 * FLOOR(id / 10)  , AVG(speed), MIN( [from] ) , MAX( [to]) 
FROM dbo.Thous_Data
GROUP BY 10 * FLOOR(id / 10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...