Имя: Пароль:
1C
 
Расчет медианы в запросе
,
0 Лодырь
 
07.05.14
12:46
тк в отличие от SQL язык запросов относительно бедный, пока ничего лучше нижнеприведенного не придумал. у кого-нибудь есть более красивые примеры реализации?

[code]
ВЫБРАТЬ
    ТаблицаДанных.Номенклатура,
    ТаблицаДанных.Количество,
    ТаблицаДанных.День
ПОМЕСТИТЬ ТаблицаДанных
ИЗ
    ТаблицаДанных КАК ТаблицаДанных
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВложенныйЗапрос.Номенклатура,
    ВЫБОР
        КОГДА ВложенныйЗапрос.Позиция < 0
            ТОГДА -ВложенныйЗапрос.Позиция
        ИНАЧЕ ВложенныйЗапрос.Позиция
    КОНЕЦ КАК Коэфициент,
    ВложенныйЗапрос.День
ПОМЕСТИТЬ ТаблицаДанныхСКоэфДней
ИЗ
    (ВЫБРАТЬ
        ТаблицаДанных.Номенклатура КАК Номенклатура,
        СУММА(ВЫБОР
                КОГДА ТаблицаДанных.Количество > ТаблицаДанных1.Количество
                    ТОГДА 1
                КОГДА ТаблицаДанных.Количество < ТаблицаДанных1.Количество
                    ТОГДА -1
                ИНАЧЕ 0
            КОНЕЦ) КАК Позиция,
        ТаблицаДанных.День КАК День
    ИЗ
        ТаблицаДанных КАК ТаблицаДанных
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДанных КАК ТаблицаДанных1
            ПО ТаблицаДанных.Номенклатура = ТаблицаДанных1.Номенклатура
    
    СГРУППИРОВАТЬ ПО
        ТаблицаДанных.Номенклатура,
        ТаблицаДанных.День) КАК ВложенныйЗапрос
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаДанных.Номенклатура,
    ТаблицаДанных.Количество КАК Медиана
ИЗ
    ТаблицаДанных КАК ТаблицаДанных
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВложенныйЗапрос.Номенклатура КАК Номенклатура,
            МАКСИМУМ(ТаблицаДанныхСКоэфДней.День) КАК День
        ИЗ
            (ВЫБРАТЬ
                ТаблицаДанныхСКоэфДней.Номенклатура КАК Номенклатура,
                МИНИМУМ(ТаблицаДанныхСКоэфДней.Коэфициент) КАК Коэфициент
            ИЗ
                ТаблицаДанныхСКоэфДней КАК ТаблицаДанныхСКоэфДней
            
            СГРУППИРОВАТЬ ПО
                ТаблицаДанныхСКоэфДней.Номенклатура) КАК ВложенныйЗапрос
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДанныхСКоэфДней КАК ТаблицаДанныхСКоэфДней
                ПО ВложенныйЗапрос.Номенклатура = ТаблицаДанныхСКоэфДней.Номенклатура
                    И ВложенныйЗапрос.Коэфициент = ТаблицаДанныхСКоэфДней.Коэфициент
        
        СГРУППИРОВАТЬ ПО
            ВложенныйЗапрос.Номенклатура) КАК ВложенныйЗапрос
        ПО ТаблицаДанных.Номенклатура = ВложенныйЗапрос.Номенклатура
            И ТаблицаДанных.День = ВложенныйЗапрос.День
[/code]
1 Лодырь
 
07.05.14
12:59
Не, я понимаю что конструкция громоздкая и малочитабельная ) Но где хотя бы флудеры-завсегдатаи.
2 Ненавижу 1С
 
гуру
07.05.14
13:05
что-то непонятно у тебя, что ты тут под медианой понимаешь?
Номенклатура, Количество, День...
Где постановка задачи?
3 Зойч
 
07.05.14
13:11
(2) Как я понял средний остаток по дням
4 Лодырь
 
07.05.14
13:15
Под медианой?
Имеем изначально таблицу неких показателей (в данном случае "Количество") для различных "Номенклатур" в разбивке по "Дням". Цель - получить для каждой "номенклатуры" значения "количества" находящегося в середине упорядоченного(для каждой "номенклатуры") по "количеству" ряда.

Пример:
Номенклатура День Количество
Товар1       1    3
Товар1       2    2
Товар1       3    10

Среднее будет 5 а медиана будет 3.
5 Maxus43
 
07.05.14
13:17
Лодырь ты, иди работай
6 Ненавижу 1С
 
гуру
07.05.14
13:19
(4) а если выборка из четного количества данных?
7 Лодырь
 
07.05.14
13:20
(6) Тогда пофигу
8 Ненавижу 1С
 
гуру
07.05.14
13:25
1. находим количество записей для каждого товара, находим серединный номер
ВЫРАЗИТЬ((КОЛИЧЕСТВО(Количество)+1)/2 КАК ЧИСЛО(10,0))

2. Нумеруем выборку по каждому товару (соединением сам с собой)

3. выбираем с нужными номерами, соединением 1 и 2
9 Лодырь
 
07.05.14
13:36
(8) Хм, немного по другому. Попробуем потестить что лучше. Завтра отпишусь.
10 Лодырь
 
08.05.14
10:16
(8) Протестил. Мой метод проигрывает твоему примерно 20% Возможно можно оптимизировать, но делал как есть.

Тестовая выборка:
N элементов Номенклатуры, для N/3 элементов сгенерировано по 30 записей, для N/3 - 15 записей и для оставшихся - 5 записей.

На N=10000 результаты 11 и 9 попугаев соответственно.
На N=100000 результат 111 и 88 попугаев.
11 Ненавижу 1С
 
гуру
08.05.14
10:17
(10) с тебя 500 рублей ))
12 GANR
 
08.05.14
10:17
(0) Не надо калькулятором забивать гвозди, а молотком считать. Для таких расчетов есть MathCAD.
13 Ненавижу 1С
 
гуру
08.05.14
10:19
(12) ага, как раз маткад для забивания калькулятором гвоздей тут
14 Лодырь
 
08.05.14
10:19
(12) Дружище, мне проще сделать все за "логистов", чем организовывать им курсы по Business Inteligence Studio и прочим MathLab'ам.
15 МихаилМ
 
08.05.14
10:36
16 Лодырь
 
08.05.14
10:39
(15) Саботажник..
17 МихаилМ
 
08.05.14
11:12
(16)
нет. скорее провокатор.
не советую переходить на личности.

кстати, книга великолепна.
18 Лодырь
 
08.05.14
11:20
(17) угу, извини если что. теперь придется читать.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс