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

Медиана определяется как число, отделяющее верхнюю половину набора данных от нижней половины. Запросите медиану северных широт (LAT_N) из STATION и округлите свой ответ до десятичных знаков.

Формат ввода

Таблица STATION описывается следующим образом:

Field : Type
ID    : NUMBER
CITY  : VARCHAR2(21)
STATE : VARCHAR2(2)
LAT_N : NUMBER
LONG_W: NUMBER

где LAT_N - северная широта, а LONG_W - западная долгота.

Мне удалось получить индекс строки только для среднего значения с

select floor((count(lat_n)+1)/2) from station;

, который является индексом строки 250. Следующим шагом является использование этого значения для извлечения значения lat_n в индексе строки 250. Как преобразовать в SQL?

Ответы [ 4 ]

0 голосов
/ 04 марта 2019
declare @Position int
set @position = round((select count(LAT_N)/2 from STATION),0)

select convert(decimal(20,4),LAT_N) from STATION
order by LAT_N
offset @position rows
fetch next 1 row only
0 голосов
/ 12 сентября 2018

Самый простой способ - использовать функцию median():

select median(lat_n)
from stations;

Вы можете округлить значение, используя такие функции, как round() или to_char().

0 голосов
/ 03 февраля 2019

Простое объяснение медианы выборки: В отдельных сериях (если число наблюдений очень мало), сначала нужно расположить все наблюдения по порядку.Тогда count (n) - это общее количество наблюдений в данных.

Если n равно нечетное , то Median (M) = значение ((n + 1)) / 2) термин элемента.

Если n равно четное , то Медиана (M) = значение [(n / 2) -го элемента элемента + (n / 2 + 1) -готермин элемента] / 2

CTE в Sql Server

Запрос:

declare @cont int,@reccount int,@first int, @second int;
set @reccount=(select COUNT(id) from STATION);
IF @reccount%2=0 --even rows
set @cont=(((@reccount)/2)+(((@reccount)/2)+1))/2; 
ELSE 
set @cont=((select count(id) from station)+1)/2;
--creating CTE
WITH Station_CTE (rowNum, Lat_n)
AS (
select row_number() over(order by lat_n desc) as 'rowNum',lat_n from station
)
SELECT top(1) SUBSTRING(convert(varchar(30),ROUND((scte.lat_n),4)),1,(CHARINDEX('.',ROUND((scte.lat_n),4),1)+4)) from Station s inner join Station_CTE as scte on scte.rowNum =@cont

Ожидаемый результат:

83.8913
0 голосов
/ 12 сентября 2018

Вот один из вариантов. Мы можем назначить номер строки, одновременно вычисляя общее количество таблиц. Тогда для таблиц с четным числом записей мы можем принять среднее значение двух средних записей в качестве медианы. Для таблиц с нечетными номерами мы можем просто взять среднюю запись.

WITH cte AS (
    SELECT s.*,
        ROW_NUMBER() OVER (ORDER BY lat_n) rn,
        COUNT(*) OVER () cnt
    FROM station s
)

SELECT AVG(lat_n)
FROM cte
WHERE
    (MOD(cnt, 2) = 0 AND rn IN (FLOOR(cnt/2), FLOOR(cnt/2) + 1)) OR
    (MOD(cnt, 2) = 1 AND rn = FLOOR(cnt/2) + 1);

Демо

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...