Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Наилучший из... (число прочтений - 6113 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Наилучший из...
18. Декабря 2011 :: 18:31
Печать  
Помогите, пожалуйста с идеей к реализации следующей проблемы.

Есть таблица с колонками:
Клиент, ТоргТочка, Агент, Показатель1, Показатель2, Показатель3

Необходимо для каждой связки Клиент+ТоргТочка выбрать одного Агента с наилучшим Показателем1 (если показатель1 одинаков у нескольких Агентов, то по показателю2, если и здесь равны, то по показателю3; если все три показателя равны у нескольких - то брать любого ОДНОГО)

Пример. Из следующей таблички:

Амор, Ленина, Иван, 20, 5, 1
Амор, Ленина, Иван, 10, 5, 1
Амор, Ленина, Кузя, 20, 7, 1
Амор, Ленина, Денис, 20, 7, 3

Выходит только одна строка:
Амор, Ленина, Денис, 20, 7, 3

П.С. Писать буду на языке запросов 8-ки
  
Наверх
 
IP записан
 
DCKiller
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 12. Декабря 2011
Re: Наилучший из...
Ответ #1 - 19. Декабря 2011 :: 02:16
Печать  
ВЫБРАТЬ ПЕРВЫЕ 1
Клиент, Агент, Точка, Показатель1, Показатель2, Показатель3
ИЗ
БД
УПОРЯДОЧИТЬ ПО
Показатель1 УБЫВ,
Показатель2 УБЫВ,
Показатель3 УБЫВ
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #2 - 19. Декабря 2011 :: 04:47
Печать  
Очень довольный
В таблице как бы связка Клиент+ТоргТочка не одна.
Из такой таблички:

Амор, Ленина, Иван, 20, 5, 1
Амор, Ленина, Иван, 10, 5, 1
Амор, Ленина, Кузя, 20, 7, 1
Амор, Ленина, Денис, 20, 7, 3
РиК, Ленина, Иван, 20, 5, 1
РиК, Ленина, Иван, 10, 5, 1
РиК, Пушкина, Кузя, 20, 7, 1
РиК, Пушкина, Денис, 20, 7, 3

Должна получится такая:
Амор, Ленина, Денис, 20, 7, 3
РиК, Ленина, Иван, 20, 5, 1
РиК, Пушкина, Денис, 20, 7, 3
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #3 - 19. Декабря 2011 :: 05:20
Печать  

выбрать
     Таблица.Клиент,
     Таблица.ТоргТочка,
     максимум(Таблица.Агент) как Агент,
     максимум(Таблица.Показатель1) как Показатель1,
     максимум(Таблица.Показатель2) как Показатель2,
     максимум(Таблица.Показатель3) как Показатель3
из Таблица
внутреннее соединение
(
     выбрать
           Клиент,
           ТоргТочка,
           максимум(Показатель1*100+Показатель2*10+Показатель3) Показатель
     из Таблица
     сгруппировать по Клиент, ТоргТочка
)Точки по Точки.Клиент = Таблица.Клиент и Точки.ТоргТочка = Таблица.ТоргТочка
         и Точки.Показатель = (Таблица.Показатель1*100+Таблица.Показатель2*10+Таблица.Показатель3)
сгруппировать по Таблица.Клиент, Таблица.ТоргТочка

коэффициенты умножения подставить согласно размерности соответствующих числовых полей
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #4 - 19. Декабря 2011 :: 05:44
Печать  
Идею понял. Спасибо, красиво получается.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #5 - 21. Декабря 2011 :: 18:54
Печать  
А можно ли что-нибудь такое же красивое придумать, в случае, если исходная таблица будет иметь еще несколько колонок, по которым не надо ни группировать, ни сортировать, но которые нужны на выходе.

Клиент, ТоргТочка, Агент, Показатель1, Показатель2, Показатель3, Реквизит1, Реквизит2

Реквизит1 и Реквизит2 нужны ес-но той строчки, откуда мы взяли Агента.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #6 - 21. Декабря 2011 :: 19:22
Печать  
выбрать
     Таблица.Клиент,
     Таблица.ТоргТочка,
     Таблица.Агент,
     Таблица.Показатель1,
     Таблица.Показатель2,
     Таблица.Показатель3,
     Таблица.Реквизит1,
     Таблица.Реквизит2
из Таблица
внутреннее соединение
(
     выбрать
           Таблица.Клиент,
           Таблица.ТоргТочка,
           максимум(Таблица.Агент) как Агент
     из Таблица
     внутреннее соединение
     (
           выбрать
                 Клиент,
                 ТоргТочка,
                 максимум(Показатель1*100+Показатель2*10+Показатель3) Показатель
           из Таблица
           сгруппировать по Клиент, ТоргТочка
     )Точки по Точки.Клиент = Таблица.Клиент и Точки.ТоргТочка = Таблица.ТоргТочка
               и Точки.Показатель = (Таблица.Показатель1*100+Таблица.Показатель2*10+Таблица.Показатель3)
     сгруппировать по Таблица.Клиент, Таблица.ТоргТочка
)Агенты по Агенты.Клиент = Таблица.Клиент и Агенты.ТоргТочка = Таблица.ТоргТочка и Агенты.Агент = Таблица.Агент
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #7 - 22. Декабря 2011 :: 04:40
Печать  
Так скорее всего не прокатит.
Вот для такой таблички:

Амор, Ленина, Иван, 20, 5, 1, Рек1, Рек2
Амор, Ленина, Иван, 10, 5, 1, Рек3, Рек4


результат будет сама табличка с двумя строками, а должна остаться только одна (первая)
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #8 - 22. Декабря 2011 :: 05:02
Печать  
а что ключ Клиент, ТоргТочка, Агент не уникален?
И этот Иван - это один и тот же иван или это разные люди?
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #9 - 22. Декабря 2011 :: 05:16
Печать  
Да, в общем случае (Клиент + ТоргТочка + Агент) - не уникальны.
В примере "Иван" - один и тот же элемент
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Наилучший из...
Ответ #10 - 22. Декабря 2011 :: 05:26
Печать  
JohnyDeath писал(а) 22. Декабря 2011 :: 04:40:
Так скорее всего не прокатит.
Вот для такой таблички:

Амор, Ленина, Иван, 20, 5, 1, Рек1, Рек2
Амор, Ленина, Иван, 10, 5, 1, Рек3, Рек4


результат будет сама табличка с двумя строками, а должна остаться только одна (первая)


Мне одному кажется, что это противоречит исходной задаче?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #11 - 22. Декабря 2011 :: 05:39
Печать  
JohnyDeath писал(а) 22. Декабря 2011 :: 05:16:
В примере "Иван" - один и тот же элемент
и показатели по нему нужно не суммировать, а брать больший?
  

1&&2&&3
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Наилучший из...
Ответ #12 - 22. Декабря 2011 :: 05:39
Печать  
выбрать
    Таблица.Клиент,
    Таблица.ТоргТочка,
    Таблица.Агент,
    Таблица.Показатель1,
    Таблица.Показатель2,
    Таблица.Показатель3,
    Таблица.Реквизит1,
    Таблица.Реквизит2
из Таблица
внутреннее соединение
(
    выбрать
          Таблица.Клиент,
          Таблица.ТоргТочка,
          максимум(Таблица.Агент) как Агент,
          Точка.Показатель
    из Таблица
    внутреннее соединение
    (
          выбрать
                Клиент,
                ТоргТочка,
                максимум(Показатель1*100+Показатель2*10+Показатель3) Показатель
          из Таблица
          сгруппировать по Клиент, ТоргТочка
    )Точки по Точки.Клиент = Таблица.Клиент и Точки.ТоргТочка = Таблица.ТоргТочка
              и Точки.Показатель = (Таблица.Показатель1*100+Таблица.Показатель2*10+Таблица.Показатель3)
    сгруппировать по Таблица.Клиент, Таблица.ТоргТочка
)Агенты по Агенты.Клиент = Таблица.Клиент и Агенты.ТоргТочка = Таблица.ТоргТочка и Агенты.Агент = Таблица.Агент
              И Агенты.Показатель = (Таблица.Показатель1*100+Таблица.Показатель2*10+Таблица.Показатель3)
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #13 - 22. Декабря 2011 :: 07:16
Печать  
trad писал(а) 22. Декабря 2011 :: 05:39:
JohnyDeath писал(а) 22. Декабря 2011 :: 05:16:
В примере "Иван" - один и тот же элемент
и показатели по нему нужно не суммировать, а брать больший?

Надо брать строку, где Наилучший Показатель1. Если показатель1 одинаковый, то по наилучшему из показателя2, если  все три показателя одинаковые, то брать любую ОДНУ строку. Остальные данные (реквизит1 и реквизит2) нужно брать из выбранной строки.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Наилучший из...
Ответ #14 - 22. Декабря 2011 :: 07:19
Печать  
Satans Claws писал(а) 22. Декабря 2011 :: 05:39:
выбрать
    Таблица.Клиент,
    Таблица.ТоргТочка,
    Таблица.Агент,
    Таблица.Показатель1,
    Таблица.Показатель2,
    Таблица.Показатель3,
    Таблица.Реквизит1,
    Таблица.Реквизит2
из Таблица
внутреннее соединение
(
    выбрать
          Таблица.Клиент,
          Таблица.ТоргТочка,
          максимум(Таблица.Агент) как Агент,
          Точка.Показатель
    из Таблица
    внутреннее соединение
    (
          выбрать
                Клиент,
                ТоргТочка,
                максимум(Показатель1*100+Показатель2*10+Показатель3) Показатель
          из Таблица
          сгруппировать по Клиент, ТоргТочка
    )Точки по Точки.Клиент = Таблица.Клиент и Точки.ТоргТочка = Таблица.ТоргТочка
              и Точки.Показатель = (Таблица.Показатель1*100+Таблица.Показатель2*10+Таблица.Показатель3)
    сгруппировать по Таблица.Клиент, Таблица.ТоргТочка
)Агенты по Агенты.Клиент = Таблица.Клиент и Агенты.ТоргТочка = Таблица.ТоргТочка и Агенты.Агент = Таблица.Агент
              И Агенты.Показатель = (Таблица.Показатель1*100+Таблица.Показатель2*10+Таблица.Показатель3)

Так не пройдет, если все показатели у Агента в нескольких строках совпадают (если я правильно понял запрос).
Например:

Амор, Ленина, Иван, 20, 5, 1, Рек1, Рек2
Амор, Ленина, Иван, 20, 5, 1, Рек3, Рек4
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать