|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |