Имя: Пароль:
1C
1С v8
SQL, помогите сделать запрос
, ,
0 miner
 
25.02.13
15:39
Народ, помогите запрос сделать, пожалуйста.
Есть таблица
Объект / Вид/ Приоритет
А         а   1
А         а   2
А         а   3
Б         б   2
Б         б   3

Нужно из этого запроса срезать строки с наибольшим приоритетом.
1 Жан Пердежон
 
25.02.13
15:40
выбрать * из таблица где приоритет = 3
2 Fragster
 
гуру
25.02.13
15:40
максимум?
3 х86
 
25.02.13
15:41
выбрать * из таблица где приоритет В(выбрать макс(приоритет)из таблица ...)
4 Maxus43
 
25.02.13
15:42
групируй по Объект, Вид, с Максимумом Приоритет. Потом выпиливай.

типа ГДЕ НЕ (Объект, Вид, Приоритет) В (Выбрать Объект, Вид, Максимум(Приоритет))...
5 GANR
 
25.02.13
16:57
В MS SQL, к слову, есть коррелированные подзапросы:

SELECT
   таблица.Объект,
   таблица.Вид,
   таблица.приоритет
FROM
   таблица AS таблица
WHERE
   таблица.приоритет =
           (SELECT
               MAX(а.приоритет)
           FROM
               таблица AS а)

а в 1С

ВЫБРАТЬ
   таблица.Объект,
   таблица.Вид,
   таблица.приоритет
ИЗ
   таблица КАК таблица
ГДЕ
   таблица.приоритет В
           (ВЫБРАТЬ
               МАКСИМУМ(а.приоритет)
           ИЗ
               таблица КАК а)
6 miner
 
25.02.13
17:11
(5)
[code]
ВЫБРАТЬ
               МАКСИМУМ(а.приоритет)
           ИЗ
               таблица КАК а
[/code]
Наверно это вернет максимум для всей таблицы? те допустим 1.
В итоге этот запрос будет искать только записи с приоритетом 1.
7 GANR
 
25.02.13
17:12
(6) совершенно верно
8 miner
 
25.02.13
17:16
(7) Не, вы не поняли. Это совершенно не верно.
Мне же в итоге нужно получить таблицу такого рода
А       а           1
Б       б           2
9 Maxus43
 
25.02.13
17:18
(8) дак сгруппируй по Объект / Вид а Максимум у приоритет, получишь максимум в разрезе нужного
10 miner
 
25.02.13
17:24
(9) Если так сделать, то мы вернемся к той таблице с которой начали ибо:
для
Объект|Вид максимумы достигаются в таблице почти на всех значениях приоритетов. Те в итоге мы получим приоритеты
(1,2,3,4,5, 6)
11 miner
 
25.02.13
17:24
И табличка
ВЫБРАТЬ
   таблица.Объект,
   таблица.Вид,
   таблица.приоритет
ИЗ
   таблица КАК таблица
ГДЕ
   таблица.приоритет В
Вернет все тоже что и раньше
12 rs_trade
 
25.02.13
17:29
(10) че? можно еще раз для тупых, чем запрос такой не устраивает

select a, b, max(c) from t group by a, b
13 alexei366
 
25.02.13
17:30
На SQL я бы сделал сортировку по полю Объект и по полю приоритет (приоритет по убыванию) и наложил бы в начале Distinct по полю Объект - так оно вроде норм получится.
А в 1С даж не знаю (всмысле не знаю как директива РАЗЛИЧНЫЕ в родном запросе работает), сначала наверно сгруппировал по Объекту и Max по приоритету и Левое соединение ещё раз с собой по Объекту для вытаскивания остальных колонок.
14 Maxus43
 
25.02.13
17:33
(11) я писал что надо:

ВЫБРАТЬ
   таблица.Объект,
   таблица.Вид,
   МАКСИМУМ(таблица.приоритет)
ИЗ
   таблица КАК таблица
ГДЕ
   таблица.приоритет В
СГРУППИРОВАТЬ ПО
Объект,
Вид
15 Maxus43
 
25.02.13
17:34
(14) + ГДЕ убрать
16 Maxus43
 
25.02.13
17:35
далее таблицу (14) соединяй с основной, по условию Приоритет <> Приоритет2
17 GANR
 
25.02.13
17:35
(8) А так?

ВЫБРАТЬ
   Таблица.Объект КАК Объект,
   Таблица.Вид КАК Вид,
   МИНИМУМ(Таблица.Приоритет) КАК Приоритет
ИЗ
   Таблица КАК Таблица

СГРУППИРОВАТЬ ПО
   Таблица.Объект,
   Таблица.Вид

Но ведь в (0) сказано МАКСИМУМ и без группировок (8).
18 GANR
 
25.02.13
17:43
Ах, надо УБРАТЬ строки с МАКСИМУМ

ВЫБРАТЬ
   Таблица.Объект КАК Объект,
   Таблица.Вид КАК Вид,
   Таблица.Приоритет КАК Приоритет
ИЗ
   Таблица КАК Таблица
ГДЕ
   НЕ (Таблица.Объект, Таблица.Вид, Таблица.Приоритет) В
               (ВЫБРАТЬ
                   Таблица.Объект КАК Объект,
                   Таблица.Вид КАК Вид,
                   МАКСИМУМ(Таблица.Приоритет) КАК Приоритет
               ИЗ
                   Таблица КАК Таблица
               СГРУППИРОВАТЬ ПО
                               Таблица.Объект,
                   Таблица.Вид)
19 Maxus43
 
25.02.13
17:45
(18) это ещё (4), но подумал что может быть нюанс, ибо (Таблица.Объект, Таблица.Вид, Таблица.Приоритет) В - сравнивает не на совпадение одновременно всех 3-х полей, а на их комбинации же. т.е. не совсем корректно
20 Maxus43
 
25.02.13
17:46
т.е. строку (б, б, 2) затрёт если будет на том конце массив (а,а,2)(б,б,3)
21 Maxus43
 
25.02.13
17:51
ВЫБРАТЬ
   Таблица.Объект КАК Объект,
   Таблица.Вид КАК Вид,
   Таблица.Приоритет КАК Приоритет
ПОМЕСТИТЬ втТЗ
ИЗ
   &Таблица КАК Таблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   втТЗ.Объект,
   втТЗ.Вид,
   МАКСИМУМ(втТЗ.Приоритет) КАК Приоритет
ПОМЕСТИТЬ втТЗ_2
ИЗ
   втТЗ КАК втТЗ

СГРУППИРОВАТЬ ПО
   втТЗ.Объект,
   втТЗ.Вид
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   втТЗ.Объект,
   втТЗ.Вид,
   втТЗ.Приоритет
ИЗ
   втТЗ КАК втТЗ
       ЛЕВОЕ СОЕДИНЕНИЕ втТЗ_2 КАК втТЗ_2
       ПО втТЗ.Объект = втТЗ_2.Объект
           И втТЗ.Вид = втТЗ_2.Вид
           И втТЗ.Приоритет = втТЗ_2.Приоритет
ГДЕ
   втТЗ_2.Объект ЕСТЬ NULL

короче так, оптимизировать можно и дальше
22 GANR
 
25.02.13
19:41
(20) Хм! Maxus43, а можно тестовый примерчик с ошибкой. Вот заготовки http://files.mail.ru/18CBCDAC2D094586AAE5059557D5B885 . Уже страшно стало - может мне переписать свои запросы (18) на (21).
23 miner
 
26.02.13
10:12
(22) да, скорее всего их нужно переписать, тк:
1) в (19) вы написали все верно.
2) но даже если он и сравнивал бы все 2 поля, то
"НЕ В (ТаблицаМаксимумов)" выбрала бы все поля которые не являются максимумами, а это совсем не означает , что будут выбраны только минимумы. Это значит лишь то, что удалятся максимуы.
Те (1,2,3),(2,3,4) удалим максимумы и получим (1,2),(2,3)
24 Maxus43
 
26.02.13
10:13
(23) ну цель же как раз отсечь максимумы, не?
25 GANR
 
26.02.13
10:20
(18) и (21), ВРОДЕ, успешно решают задачу отсечения максимумов с различными данными. У меня как-то не получилось смоделировать ошибку (19), как ни старался.

Вообще вот такое:

(Таблица.Объект, Таблица.Вид) В
               (ВЫБРАТЬ
                   Таблица.Объект КАК Объект,
                   Таблица.Вид КАК Вид,
                   МАКСИМУМ(Таблица.Приоритет) ...

конструктор запросов не ест
26 Maxus43
 
26.02.13
10:29
Таки думаю (18) правильно. (21) конечно тоже, просто я "В (Выбрать..." заменил на Соединение
27 GANR
 
26.02.13
12:08
(26) Вот и профайлер

Исходные данные:

INSERT INTO #tt1 (_Q_001_F_000, _Q_001_F_001, _Q_001_F_002) SELECT
P1,
@P2,
@P3
UNION ALL SELECT
P1,
@P2,
@P4
UNION ALL SELECT
P1,
@P2,
@P5
UNION ALL SELECT
@P6,
@P7,
@P3
UNION ALL SELECT
@P6,
@P7,
@P4
UNION ALL SELECT
@P6,
@P7,
@P5
UNION ALL SELECT
@P6,
@P7,
@P8
UNION ALL SELECT
@P6,
@P7,
@P9

(18)

SELECT
T1._Q_001_F_000,
T1._Q_001_F_001,
T1._Q_001_F_002
FROM #tt1 T1 WITH(NOLOCK)
WHERE (NOT ((EXISTS(SELECT
1
FROM #tt1 T2 WITH(NOLOCK)
GROUP BY T2._Q_001_F_000,
T2._Q_001_F_001
HAVING (T1._Q_001_F_000 = T2._Q_001_F_000) AND (T1._Q_001_F_001 = T2._Q_001_F_001) AND (T1._Q_001_F_002 = MAX(T2._Q_001_F_002))))))

(21)

SELECT
T1._Q_001_F_000,
T1._Q_001_F_001,
T1._Q_001_F_002
FROM #tt1 T1 WITH(NOLOCK)
LEFT OUTER JOIN (SELECT
T3._Q_001_F_000 AS Q_001_F_000_,
T3._Q_001_F_001 AS Q_001_F_001_,
MAX(T3._Q_001_F_002) AS Q_001_F_002_
FROM #tt1 T3 WITH(NOLOCK)
GROUP BY T3._Q_001_F_000,
T3._Q_001_F_001) T2
ON (((T1._Q_001_F_000 = T2.Q_001_F_000_) AND (T1._Q_001_F_001 = T2.Q_001_F_001_)) AND (T1._Q_001_F_002 = T2.Q_001_F_002_))
WHERE T2.Q_001_F_000_ IS NULL
28 GANR
 
26.02.13
13:24
(27) ну и спойлер - весь запрос изуродовал http://files.mail.ru/689EACEDFD6F4399B51435C6959244D9
29 miner
 
26.02.13
17:16
(24) нет, цель была сделать таблицу - срез максимумов/минимумов, а не отсечь максимумы/минимумы
к тому же эта конструкция у вас не работает как вы думаете. Она ищет комбинации(проверено)
30 sapphire
 
26.02.13
17:24
(29) срез максимумов/минимумов:

SELECT
Объект
,Вид
,MIN(Приоритет) ПриоритетМинимумПоля
,MAX(Приоритет) ПриоритетМаксимумПоля
FROM
(
//Объект / Вид/ Приоритет
SELECT "А" Объект,        "а" Вид,   1 Приоритет
UNION ALL
SELECT "А" Объект,        "а" Вид,   2 Приоритет
UNION ALL
SELECT "А" Объект,        "а" Вид,   3 Приоритет
UNION ALL
SELECT "Б" Объект,        "б" Вид,   2 Приоритет
UNION ALL
SELECT "Б" Объект,        "б" Вид,   3 Приоритет
) ОбъектВидПриоритет
GROUP BY
Объект
,Вид
31 GANR
 
26.02.13
17:38
(29) Ну, GANR и Maxus43 тоже извлекли пользу из этой ветки ))). Надеюсь, (30) подойдет?