Имя: Пароль:
1C
1С v8
Медиана в запросе
,
0 Fragster
 
гуру
09.10.14
10:27
Как вычислить медиану https://ru.wikipedia.org/wiki/Медиана_(статистика) в запросе. Желательно так, чтобы не очень тормозило. Ну, или в СКД.
1 Fragster
 
гуру
09.10.14
10:27
знаки вопроса забыл :)
2 PR
 
09.10.14
10:29
(1) А мы-то уже настроились послушать :))
3 ilyavorobyev
 
09.10.14
10:31
(0) не благодари

SELECT top 1
  t1.val median,
  avg( t2.val) average
FROM
  t AS t1,
  t AS t2
GROUP BY
  t1.id,
  t1.val
ORDER BY
  abs(
    sum(
      case
        when t1.val > t2.val then 1
        when t1.val < t2.val then -1
        else 0
      end
    )
  )
4 ssh2QQ6
 
09.10.14
10:46
Штатная возможность в АнализДанных есть, не знаю подойдет это или нет, я как то раз использовал
5 Нуф Нуф XIX
 
09.10.14
10:49
вот для нечетного количества:
ВЫБРАТЬ
    5 КАК Значение
ПОМЕСТИТЬ ТаблицаЗначений

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    13

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    15

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    17
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаЗначений.Значение,
    МАКСИМУМ(ТаблицаЗначенийДляСоединенияМаксимум.Значение) КАК ЗначениеСнизу,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТаблицаЗначенийДляСоединенияМаксимум.Значение) КАК КоличествоСнизу,
    МИНИМУМ(ТаблицаЗначенийДляСоединенияМинимум.Значение) КАК ЗначениеСверху,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТаблицаЗначенийДляСоединенияМинимум.Значение) КАК КоличествоСверху
ПОМЕСТИТЬ ИтоговаяТаблица
ИЗ
    ТаблицаЗначений КАК ТаблицаЗначений
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗначений КАК ТаблицаЗначенийДляСоединенияМинимум
        ПО ТаблицаЗначений.Значение < ТаблицаЗначенийДляСоединенияМинимум.Значение
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗначений КАК ТаблицаЗначенийДляСоединенияМаксимум
        ПО ТаблицаЗначений.Значение > ТаблицаЗначенийДляСоединенияМаксимум.Значение

СГРУППИРОВАТЬ ПО
    ТаблицаЗначений.Значение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИтоговаяТаблица.Значение,
    (ИтоговаяТаблица.ЗначениеСнизу + ИтоговаяТаблица.ЗначениеСверху) / 2 КАК Поле1
ИЗ
    ИтоговаяТаблица КАК ИтоговаяТаблица
ГДЕ
    ИтоговаяТаблица.КоличествоСнизу = ИтоговаяТаблица.КоличествоСверху
6 Fragster
 
гуру
09.10.14
13:42
(3)(5) "Желательно так, чтобы не очень тормозило"
7 Fragster
 
гуру
09.10.14
13:45
к тому же (5) не работает (для примера результат 13, а вот когда добавляем много восьмерок в выборку так, чтобы оно должно бы стать 8 - не работает)
8 ilyavorobyev
 
09.10.14
13:56
(7) чем тебя (3) не устраивает?
9 Fragster
 
гуру
09.10.14
13:58
(8) в 1се не совсем работает
10 Fragster
 
гуру
09.10.14
13:59
(9)+ список должен быть пронумерован
11 ilyavorobyev
 
09.10.14
14:00
(9) найди функции такие же в 1с, перепиши его под 1с и все
12 Крошка Ру
 
09.10.14
14:02
(10) Ну и в чем проблема? Нумеруй и находи медиану. Как пронумеровать строки в запросе - на мисте есть статья.
13 Fragster
 
гуру
09.10.14
14:04
(12) там нет как пронумеровать с одинаковыми значениями ;)
14 Fragster
 
гуру
09.10.14
14:04
в смысле вот данные: 1,1,1,1,1,10, нумеруй. а медиана тут 1
15 vi0
 
09.10.14
14:09
кто где на практике используете это? расскажите
16 Fragster
 
гуру
09.10.14
14:11
(15) пир ненормальном распределении лучше использовать ее, чем мат ожидание для прогнозирования
17 Крошка Ру
 
09.10.14
14:39
(16) Не спрашивай как это работает:

ВЫБРАТЬ
    Таблица.Значение КАК Значение
ПОМЕСТИТЬ ВТ_Таблица
ИЗ
    Таблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Значение,
    СУММА(1) КАК КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаКоличество
ИЗ
    ВТ_Таблица КАК ВТ_Таблица

СГРУППИРОВАТЬ ПО
    ВТ_Таблица.Значение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ТаблицаКоличество.Значение,
    ВТ_ТаблицаКоличество.КоличествоЭлементов,
    ВЫБОР
        КОГДА ВТ_ТаблицаКоличество.Значение > ВТ_ТаблицаКоличество1.Значение
            ТОГДА 1
        КОГДА ВТ_ТаблицаКоличество.Значение < ВТ_ТаблицаКоличество1.Значение
            ТОГДА -1
        ИНАЧЕ 0
    КОНЕЦ КАК ОтносительноеПоложение
ПОМЕСТИТЬ ВТ_ТаблицаПоложение
ИЗ
    ВТ_ТаблицаКоличество КАК ВТ_ТаблицаКоличество,
    ВТ_ТаблицаКоличество КАК ВТ_ТаблицаКоличество1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    ВТ_ТаблицаПоложение.Значение,
    ВТ_ТаблицаПоложение.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаМиниМакс
ИЗ
    ВТ_ТаблицаПоложение КАК ВТ_ТаблицаПоложение
ГДЕ
    ВТ_ТаблицаПоложение.ОтносительноеПоложение >= 0

УПОРЯДОЧИТЬ ПО
    ВТ_ТаблицаПоложение.ОтносительноеПоложение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    ВТ_ТаблицаПоложение.Значение,
    ВТ_ТаблицаПоложение.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаМаксиМин
ИЗ
    ВТ_ТаблицаПоложение КАК ВТ_ТаблицаПоложение
ГДЕ
    ВТ_ТаблицаПоложение.ОтносительноеПоложение <= 0

УПОРЯДОЧИТЬ ПО
    ВТ_ТаблицаПоложение.ОтносительноеПоложение УБЫВ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫБОР
        КОГДА ВТ_ТаблицаМаксиМин.КоличествоЭлементов > ВТ_ТаблицаМиниМакс.КоличествоЭлементов
            ТОГДА ВТ_ТаблицаМаксиМин.Значение
        КОГДА ВТ_ТаблицаМаксиМин.КоличествоЭлементов < ВТ_ТаблицаМиниМакс.КоличествоЭлементов
            ТОГДА ВТ_ТаблицаМиниМакс.Значение
        ИНАЧЕ (ВТ_ТаблицаМаксиМин.КоличествоЭлементов + ВТ_ТаблицаМиниМакс.КоличествоЭлементов) / 2
    КОНЕЦ КАК Медиана
ИЗ
    ВТ_ТаблицаМиниМакс КАК ВТ_ТаблицаМиниМакс,
    ВТ_ТаблицаМаксиМин КАК ВТ_ТаблицаМаксиМин
18 Крошка Ру
 
09.10.14
14:45
Поправочка:

ВЫБРАТЬ
    Таблица.Значение КАК Значение
ПОМЕСТИТЬ ВТ_Таблица
ИЗ
    &Таблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Значение,
    СУММА(1) КАК КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаКоличество
ИЗ
    ВТ_Таблица КАК ВТ_Таблица

СГРУППИРОВАТЬ ПО
    ВТ_Таблица.Значение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Значение,
    ВЫБОР
        КОГДА ВТ_Таблица.Значение > ВТ_Таблица1.Значение
            ТОГДА 1
        КОГДА ВТ_Таблица.Значение < ВТ_Таблица1.Значение
            ТОГДА -1
        ИНАЧЕ 0
    КОНЕЦ КАК ОтносительноеПоложение,
    ВТ_ТаблицаКоличество.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаПоложение
ИЗ
    ВТ_Таблица КАК ВТ_Таблица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТаблицаКоличество КАК ВТ_ТаблицаКоличество
        ПО ВТ_Таблица.Значение = ВТ_ТаблицаКоличество.Значение,
    ВТ_Таблица КАК ВТ_Таблица1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    ВТ_ТаблицаПоложение.Значение,
    ВТ_ТаблицаПоложение.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаМиниМакс
ИЗ
    ВТ_ТаблицаПоложение КАК ВТ_ТаблицаПоложение
ГДЕ
    ВТ_ТаблицаПоложение.ОтносительноеПоложение >= 0

УПОРЯДОЧИТЬ ПО
    ВТ_ТаблицаПоложение.ОтносительноеПоложение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    ВТ_ТаблицаПоложение.Значение,
    ВТ_ТаблицаПоложение.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаМаксиМин
ИЗ
    ВТ_ТаблицаПоложение КАК ВТ_ТаблицаПоложение
ГДЕ
    ВТ_ТаблицаПоложение.ОтносительноеПоложение <= 0

УПОРЯДОЧИТЬ ПО
    ВТ_ТаблицаПоложение.ОтносительноеПоложение УБЫВ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫБОР
        КОГДА ВТ_ТаблицаМаксиМин.КоличествоЭлементов > ВТ_ТаблицаМиниМакс.КоличествоЭлементов
            ТОГДА ВТ_ТаблицаМаксиМин.Значение
        КОГДА ВТ_ТаблицаМаксиМин.КоличествоЭлементов < ВТ_ТаблицаМиниМакс.КоличествоЭлементов
            ТОГДА ВТ_ТаблицаМиниМакс.Значение
        ИНАЧЕ (ВТ_ТаблицаМаксиМин.Значение + ВТ_ТаблицаМиниМакс.Значение) / 2
    КОНЕЦ КАК Медиана
ИЗ
    ВТ_ТаблицаМиниМакс КАК ВТ_ТаблицаМиниМакс,
    ВТ_ТаблицаМаксиМин КАК ВТ_ТаблицаМаксиМин
19 МихаилМ
 
09.10.14
14:47
медиану можно рассчитать
в анализ данных
20 Крошка Ру
 
09.10.14
14:48
Да что ж такое!

ВЫБРАТЬ
    Таблица.Значение КАК Значение
ПОМЕСТИТЬ ВТ_Таблица
ИЗ
    &Таблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Значение,
    СУММА(1) КАК КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаКоличество
ИЗ
    ВТ_Таблица КАК ВТ_Таблица

СГРУППИРОВАТЬ ПО
    ВТ_Таблица.Значение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Значение,
    СУММА(ВЫБОР
            КОГДА ВТ_Таблица.Значение > ВТ_Таблица1.Значение
                ТОГДА 1
            КОГДА ВТ_Таблица.Значение < ВТ_Таблица1.Значение
                ТОГДА -1
            ИНАЧЕ 0
        КОНЕЦ) КАК ОтносительноеПоложение,
    ВТ_ТаблицаКоличество.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаПоложение
ИЗ
    ВТ_Таблица КАК ВТ_Таблица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТаблицаКоличество КАК ВТ_ТаблицаКоличество
        ПО ВТ_Таблица.Значение = ВТ_ТаблицаКоличество.Значение,
    ВТ_Таблица КАК ВТ_Таблица1

СГРУППИРОВАТЬ ПО
    ВТ_Таблица.Значение,
    ВТ_ТаблицаКоличество.КоличествоЭлементов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    ВТ_ТаблицаПоложение.Значение,
    ВТ_ТаблицаПоложение.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаМиниМакс
ИЗ
    ВТ_ТаблицаПоложение КАК ВТ_ТаблицаПоложение
ГДЕ
    ВТ_ТаблицаПоложение.ОтносительноеПоложение >= 0

УПОРЯДОЧИТЬ ПО
    ВТ_ТаблицаПоложение.ОтносительноеПоложение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    ВТ_ТаблицаПоложение.Значение,
    ВТ_ТаблицаПоложение.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаМаксиМин
ИЗ
    ВТ_ТаблицаПоложение КАК ВТ_ТаблицаПоложение
ГДЕ
    ВТ_ТаблицаПоложение.ОтносительноеПоложение <= 0

УПОРЯДОЧИТЬ ПО
    ВТ_ТаблицаПоложение.ОтносительноеПоложение УБЫВ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫБОР
        КОГДА ВТ_ТаблицаМаксиМин.КоличествоЭлементов > ВТ_ТаблицаМиниМакс.КоличествоЭлементов
            ТОГДА ВТ_ТаблицаМаксиМин.Значение
        КОГДА ВТ_ТаблицаМаксиМин.КоличествоЭлементов < ВТ_ТаблицаМиниМакс.КоличествоЭлементов
            ТОГДА ВТ_ТаблицаМиниМакс.Значение
        ИНАЧЕ (ВТ_ТаблицаМаксиМин.Значение + ВТ_ТаблицаМиниМакс.Значение) / 2
    КОНЕЦ КАК Медиана
ИЗ
    ВТ_ТаблицаМиниМакс КАК ВТ_ТаблицаМиниМакс,
    ВТ_ТаблицаМаксиМин КАК ВТ_ТаблицаМаксиМин
21 Крошка Ру
 
09.10.14
15:25
Медиана в запросе 2.0:

ВЫБРАТЬ
    Таблица.Значение КАК Значение
ПОМЕСТИТЬ ВТ_Таблица
ИЗ
    &Таблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Значение,
    СУММА(1) КАК КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаКоличество
ИЗ
    ВТ_Таблица КАК ВТ_Таблица

СГРУППИРОВАТЬ ПО
    ВТ_Таблица.Значение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Таблица.Значение,
    СУММА(ВЫБОР
            КОГДА ВТ_Таблица.Значение > ВТ_Таблица1.Значение
                ТОГДА 1
            ИНАЧЕ 0
        КОНЕЦ) КАК КоличествоЭлементовМеньше,
    СУММА(ВЫБОР
            КОГДА ВТ_Таблица.Значение < ВТ_Таблица1.Значение
                ТОГДА 1
            ИНАЧЕ 0
        КОНЕЦ) КАК КоличествоЭлементовБольше,
    ВТ_ТаблицаКоличество.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаОтносительноеПоложение
ИЗ
    ВТ_Таблица КАК ВТ_Таблица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТаблицаКоличество КАК ВТ_ТаблицаКоличество
        ПО ВТ_Таблица.Значение = ВТ_ТаблицаКоличество.Значение,
    ВТ_Таблица КАК ВТ_Таблица1

СГРУППИРОВАТЬ ПО
    ВТ_Таблица.Значение,
    ВТ_ТаблицаКоличество.КоличествоЭлементов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_ТаблицаОтносительноеПоложение.Значение,
    ВТ_ТаблицаОтносительноеПоложение.КоличествоЭлементовМеньше / ВТ_ТаблицаОтносительноеПоложение.КоличествоЭлементов КАК КоличествоЭлементовМеньше,
    ВТ_ТаблицаОтносительноеПоложение.КоличествоЭлементовБольше / ВТ_ТаблицаОтносительноеПоложение.КоличествоЭлементов КАК КоличествоЭлементовБольше,
    ВТ_ТаблицаОтносительноеПоложение.КоличествоЭлементов
ПОМЕСТИТЬ ВТ_ТаблицаСгруппированноеПоложение
ИЗ
    ВТ_ТаблицаОтносительноеПоложение КАК ВТ_ТаблицаОтносительноеПоложение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СРЕДНЕЕ(ВТ_ТаблицаСгруппированноеПоложение.Значение) КАК Значение
ИЗ
    ВТ_ТаблицаСгруппированноеПоложение КАК ВТ_ТаблицаСгруппированноеПоложение
ГДЕ
    ВТ_ТаблицаСгруппированноеПоложение.КоличествоЭлементов + ВТ_ТаблицаСгруппированноеПоложение.КоличествоЭлементовМеньше >= ВТ_ТаблицаСгруппированноеПоложение.КоличествоЭлементовБольше
    И ВТ_ТаблицаСгруппированноеПоложение.КоличествоЭлементов + ВТ_ТаблицаСгруппированноеПоложение.КоличествоЭлементовБольше >= ВТ_ТаблицаСгруппированноеПоложение.КоличествоЭлементовМеньше
22 Fragster
 
гуру
09.10.14
16:36
ВЫБРАТЬ
    1 КАК Зн
ПОМЕСТИТЬ Т

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫРАЗИТЬ(КОЛИЧЕСТВО(Т.Зн) / 2 КАК ЧИСЛО(10, 0)) КАК КолТ_Мин,
    ВЫРАЗИТЬ((КОЛИЧЕСТВО(Т.Зн) + 1) / 2 КАК ЧИСЛО(10, 0)) КАК КолТ_Макс
ПОМЕСТИТЬ КолТ
ИЗ
    Т КАК Т
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Т.Зн,
    СУММА(1) КАК КолЗн
ПОМЕСТИТЬ КолЗн
ИЗ
    Т КАК Т

СГРУППИРОВАТЬ ПО
    Т.Зн
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КолЗн1.Зн,
    СУММА(КолЗн2.КолЗн) КАК КолЗн
ПОМЕСТИТЬ Данные
ИЗ
    КолЗн КАК КолЗн1
        ЛЕВОЕ СОЕДИНЕНИЕ КолЗн КАК КолЗн2
        ПО КолЗн1.Зн >= КолЗн2.Зн

СГРУППИРОВАТЬ ПО
    КолЗн1.Зн
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СРЕДНЕЕ(Вложенный.Зн) КАК Зн
ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 1
        Данные.Зн КАК Зн
    ИЗ
        Данные КАК Данные
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ КолТ КАК КолТ
            ПО Данные.КолЗн >= КолТ.КолТ_Мин
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ ПЕРВЫЕ 1
        Данные.Зн
    ИЗ
        Данные КАК Данные
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ КолТ КАК КолТ
            ПО Данные.КолЗн >= КолТ.КолТ_Макс) КАК Вложенный
23 ILM
 
гуру
09.10.14
17:35
Мужики. Запросами меряются )))

Мое мнение, что среднее, что медиана, что Гаусс, всё плохо для прогнозов, а в нашей стране и подавно. SDBR наше всё.
24 Крошка Ру
 
09.10.14
17:42
(23) Правда красивые?