Найти максимум без использования временных таблиц

1. roofless 23 25.10.16 15:43 Сейчас в теме
Есть таблица СотрудникиПринадлежность с полями НомерСотрудника (число), ШтатнаяДолжность (число), НомерДокумента (число).
Необходимо найти штатную должность сотрудника по его номеру, взяв её из документа с максимальным номером.
Тк используем внешний источник данных, то временные таблицы использовать нельзя.
Делаю так:
ВЫБРАТЬ
	РезультатыСогласованияЗНП.ИдентификаторЗНП КАК ИдентификаторЗНП,
	РезультатыСогласованияЗНП.ФИОСогласующего,
	РезультатыСогласованияЗНП.НомерСотрудника,
	ВложенныйЗапрос.ШтатнаяДолжность
ИЗ
	ВнешнийИсточникДанных.XYZ.Таблица.РезультатыСогласованияЗНП КАК РезультатыСогласованияЗНП
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			СотрудникиПринадлежность.НомерСотрудника КАК НомерСотрудника,
			СотрудникиПринадлежность.ШтатнаяДолжность КАК ШтатнаяДолжность,
			МАКСИМУМ(СотрудникиПринадлежность.НомерДокумента ) КАК НомерДокумента
		ИЗ
			ВнешнийИсточникДанных.XYZ.Таблица.СотрудникиПринадлежность КАК СотрудникиПринадлежность
		
		СГРУППИРОВАТЬ ПО
			СотрудникиПринадлежность.ШтатнаяДолжность,
			СотрудникиПринадлежность.НомерСотрудника) КАК ВложенныйЗапрос
		ПО РезультатыСогласованияЗНП.НомерСотрудника= ВложенныйЗапрос.НомерСотрудника
Показать


но в результате получаю все штатные должности сотрудника, а не последнюю.
Объясните, что я не так делаю?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. kuzev 47 25.10.16 16:05 Сейчас в теме
(1) внутренний запрос: нужно сначала найти "максимальный номер документа" для "номера сотрудника", а затем для "номер сотрудника" подтянуть "штатную должность" для "номер документа" = "максимальный номер документа".
roofless; +1 Ответить
13. roofless 23 26.10.16 08:39 Сейчас в теме
(5) понимаю алгоритм, но не понимаю как это сделать вложенными запросами
15. kuzev 47 26.10.16 09:46 Сейчас в теме
(13) проверить не могу. Как-то так:
ВЫБРАТЬ
    РезультатыСогласованияЗНП.ИдентификаторЗНП КАК ИдентификаторЗНП,
    РезультатыСогласованияЗНП.ФИОСогласующего,
    РезультатыСогласованияЗНП.НомерСотрудника,
    ВложенныйЗапрос.ШтатнаяДолжность
ИЗ
    ВнешнийИсточникДанных.XYZ.Таблица.РезультатыСогласованияЗНП КАК РезультатыСогласованияЗНП

	ЛЕВОЕ СОЕДИНЕНИЕ

		// -->
		(ВЫБРАТЬ
			Т1.НомерСотрудника,
			//Т1.НомерДокумента,
			Т2.ШтатнаяДолжность
		ИЗ	
			(ВЫБРАТЬ
				СотрудникиПринадлежность.НомерСотрудника КАК НомерСотрудника,
				МАКСИМУМ(СотрудникиПринадлежность.НомерДокумента) КАК НомерДокумента
			ИЗ
				ВнешнийИсточникДанных.XYZ.Таблица.СотрудникиПринадлежность КАК СотрудникиПринадлежность

			СГРУППИРОВАТЬ ПО
				СотрудникиПринадлежность.НомерСотрудника
			) КАК Т1
	
			ЛЕВОЕ СОЕДИНЕНИЕ
				ВнешнийИсточникДанных.XYZ.Таблица.СотрудникиПринадлежность КАК Т2
			ПО
				Т1.НомерСотрудника = Т2.НомерСотрудника
				И Т1.НомерДокумента = Т2.НомерДокумента
		) ВложенныйЗапрос
		// <--

	ПО
		РезультатыСогласованияЗНП.НомерСотрудника = ВложенныйЗапрос.НомерСотрудника
Показать
roofless; +1 Ответить
17. roofless 23 26.10.16 11:17 Сейчас в теме
(15) (16) оба варианта дублируют записи почему-то
18. kuzev 47 26.10.16 11:19 Сейчас в теме
(17) а если так:
        // -->
        (ВЫБРАТЬ РАЗЛИЧНЫЕ
            Т1.НомерСотрудника,
            //Т1.НомерДокумента,
            Т2.ШтатнаяДолжность
...

Ну, и результат покажите. Что задваивается?
roofless; +1 Ответить
19. roofless 23 26.10.16 11:24 Сейчас в теме
(18) да-да, так уже без дублей. забыл, что во вложенном запросе уже только числовые типы и можно выбрать различные
16. tailer2 26.10.16 11:01 Сейчас в теме
(13) что в (4) написано, совсем не?
2. tailer2 25.10.16 15:57 Сейчас в теме
значение поля "номер документа2 здесь будет максимальным для всех записей
3. necropunk 9 25.10.16 16:00 Сейчас в теме
Выбрать Первые 1 
НомерДокумента 
Из СотрудникиПринадлежность 
Упорядочить По 
НомерДокумента УБЫВ


Так не получится? или я чего-то не понял?
4. tailer2 25.10.16 16:04 Сейчас в теме
ВЫБРАТЬ
            СотрудникиПринадлежность.НомерСотрудника КАК НомерСотрудника,
            СотрудникиПринадлежность.ШтатнаяДолжность КАК ШтатнаяДолжность,
            СотрудникиПринадлежность.НомерДокумента КАК НомерДокумента
        ИЗ
            ВнешнийИсточникДанных.XYZ.Таблица.СотрудникиПринадлежность КАК СотрудникиПринадлежность

внутреннее соединение (ВЫБРАТЬ

            сп.НомерСотрудника КАК НомерСотрудника,
            сп.ШтатнаяДолжность КАК ШтатнаяДолжность,
            максимум(сп.НомерДокумента) как номДок
        ИЗ
            ВнешнийИсточникДанных.XYZ.Таблица.СотрудникиПринадлежность) КАК сп

ПО РезультатыСогласованияЗНП.НомерСотрудника= сп.НомерСотрудника
и РезультатыСогласованияЗНП.ШтатнаяДолжность= сп.ШтатнаяДолжность
и РезультатыСогласованияЗНП.НомерДокумента= сп.номДок) как СотрудникиПринадлежность
 
Показать
6. hellion 31 25.10.16 16:07 Сейчас в теме
Как-то так, думаю:
ВЫБРАТЬ
    РезультатыСогласованияЗНП.ИдентификаторЗНП КАК ИдентификаторЗНП,
    РезультатыСогласованияЗНП.ФИОСогласующего,
    РезультатыСогласованияЗНП.НомерСотрудника,
    ВложенныйЗапрос2.ШтатнаяДолжность
ИЗ
    ВнешнийИсточникДанных.XYZ.Таблица.РезультатыСогласованияЗНП КАК РезультатыСогласованияЗНП
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            СотрудникиПринадлежность.НомерСотрудника КАК НомерСотрудника,
            МАКСИМУМ(СотрудникиПринадлежность.НомерДокумента ) КАК НомерДокумента
        ИЗ
            ВнешнийИсточникДанных.XYZ.Таблица.СотрудникиПринадлежность КАК СотрудникиПринадлежность        
        СГРУППИРОВАТЬ ПО
            СотрудникиПринадлежность.НомерСотрудника) КАК ВложенныйЗапрос
        ПО РезультатыСогласованияЗНП.НомерСотрудника= ВложенныйЗапрос.НомерСотрудника
		
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            СотрудникиПринадлежность.НомерСотрудника КАК НомерСотрудника,
            СотрудникиПринадлежность.ШтатнаяДолжность КАК ШтатнаяДолжность,
            СотрудникиПринадлежность.НомерДокумента КАК НомерДокумента
        ИЗ
            ВнешнийИсточникДанных.XYZ.Таблица.СотрудникиПринадлежность КАК СотрудникиПринадлежность
        ) КАК ВложенныйЗАпрос2
		ПО ВложенныйЗАпрос2.НомерСотрудника = ВложенныйЗапрос.НомерСотрудника
		И ВложенныйЗАпрос2.НомерДокумента = ВложенныйЗапрос.НомерДокумента
Показать
roofless; +1 Ответить
7. roofless 23 25.10.16 16:31 Сейчас в теме
(6) отличная идея, но дублируются записи
8. tailer2 25.10.16 16:34 Сейчас в теме
(7) два левых никогда не бывают отличной идеей

попробовать (4) не судьба?
12. roofless 23 26.10.16 08:36 Сейчас в теме
(8) попробовал.
результат для номера сотрудника 48352:

НомерДокумента НомерСотрудника ШтатнаяДолжность
8566154 48352 50407406
8566154 48352 50407406
8393241 48352 50355405
8393241 48352 50355405
8393241 48352 50321669
8393241 48352 50303385
8393241 48352 50217573
9. hellion 31 25.10.16 16:34 Сейчас в теме
(7) Странно, что дублируются. Напишите ВЫБРАТЬ РАЗЛИЧНЫЕ
10. tailer2 25.10.16 16:35 Сейчас в теме
14. roofless 23 26.10.16 08:40 Сейчас в теме
(9) выбрать различные невозможно, тк поля в источнике данных неограниченной длины
11. rossin 25.10.16 17:28 Сейчас в теме
Из-за чего выводятся все должности: из-за СГРУППИРОВАТЬ ПО
СотрудникиПринадлежность.ШтатнаяДолжность,
Если у сотрудника с номером Н были разными документами установлены должности А и Б последовательно, то внутренний запрос вернет две строки
Н, А, номер документа 1
Н, Б, номер документа 2
Поэтому при лев соединении первой таблицы со второй по Н и получаем размножение строк.
Как надо - написали в 5-ом сообщении.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот