Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Группировка по нескольким столбцам  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Всем привет: Помогите пожалуйста, гугл и прочие не помогают, бьюсь несколько часов, подскажите пожалуйста:

Есть большая таблица данным, есть огромный запрос в котором около 10 JOIN ов, собирающие данные с разных таблиц.

Примерно такой:
	from dbo.MPV_catalogue left join dbo.Voc_region
	ON dbo.MPV_catalogue.Code_district = dbo.Voc_region.Code_region 
	left join
	dbo.MPV_correspondence ON dbo.MPV_catalogue.Code_MPV = dbo.MPV_correspondence.Code_MPV 
	left join
	dbo.Voc_gg_structure ON MPV_correspondence.Code_gg_structure = Voc_GG_structure.Code_gg_structure
	left join
	dbo.Voc_gidr ON MPV_correspondence.Code_gidr = Voc_gidr.Code_gidr
	left join
------------------------------------------------------------	
	--dbo.MPV_Spares_WG 
	(SELECT Code_MPV, 
	szapg, zapA, zapB, zapC1, zapC2, Code_inst, Code_WG, Code_use_type, nprot
	,MAX(Datauz) as m_datauz
              FROM MPV_Spares_WG
       GROUP BY Code_MPV,szapg, zapA, zapB, zapC1, zapC2, Code_inst, Code_WG, Code_use_type
       ,nprot
       ) as bla
	ON MPV_catalogue.Code_MPV = bla.Code_MPV
------------------------------------------------------------		
	
	left join 
	Voc_inst ON bla.Code_inst = Voc_inst.Code_inst
	left join 
	Voc_water_gorizont ON bla.Code_WG = Voc_water_gorizont.Code_WG
	left join
	Voc_use_type ON bla.Code_use_type = Voc_use_type.Code_use_type
	left join
	dbo.VZ_correspondence ON dbo.MPV_catalogue.Code_MPV = dbo.VZ_correspondence.Code_MPV
	left join
	dbo.VZ_dob_god ON VZ_correspondence.Code_VZ = VZ_dob_god.Code_VZ
	
	where bla.Code_MPV = '7111006501'



И в общем понадобилось сгруппировать выборку по максимальной дате, внизу привожу небольшой пример

Code_MPV_______MAX(Datauz) as m_datauz___nprot
7111006501 2008-11-10 00:00:00.000 14/08
7111006501 2016-08-16 00:00:00.000 3/16

получается так, а смысл всего этого - нужно получить строку с максимальной датой

Code_MPV_______MAX(Datauz) as m_datauz___nprot
7111006501 2016-08-16 00:00:00.000 3/16

Я понимаю что нужно как то соединить nprot и дату, возможно двумя джойнами, но почему то не приходит в голову как.
Всю свою портянку которую пытался сочинить выложил между -----------
Подскажите пожалуйста.

К сообщению приложен файл. Размер - 10Kb
23 мар 17, 15:34    [20326373]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
LoopN
Guest
select top 1 with ties .....
from ....

order by date_column desc
23 мар 17, 22:36    [20327698]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
Добрый Э - Эх
Guest
j-ester,

Простая задача
24 мар 17, 05:56    [20327956]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Спасибо большое , то что надо.
Но возникла другая проблема, у меня уже каша в голове.

При использовании запроса

select *
  from (
         select t.*, row_number() 
                           over(partition by Code_MPV 
                                    order by Datauz desc) as rn
           from MPV_Spares_WG t
       ) v
 where rn = 1) bla
	ON MPV_catalogue.Code_MPV = bla.Code_MPV


Он все верно соединяет, но как я гворил , у меня таблица где много join-ов.

Так вот, далее оказывается нужно еще вывести разхные данные из связанной таблицы, но при связи я получаю три одинаковых варианта по связи
	left join 
	Voc_water_gorizont 
	
	ON bla.Code_WG = Voc_water_gorizont.Code_WG

Что вполне логично, ведь в bla у меня ОДНА ЗАПИСЬ.


При этом , вариант

--Вариант 3
(
select t1.*
  from MPV_Spares_WG t1,
       (
         select Code_MPV,max(Datauz)as kkk
           from MPV_Spares_WG
          group by Code_MPV
       ) v
       
 where t1.Code_MPV = v.Code_MPV
   and t1.Datauz = v.kkk
)bla
ON MPV_catalogue.Code_MPV = bla.Code_MPV

------------------------
	left join 
	Voc_water_gorizont 
	
	ON bla.Code_WG = Voc_water_gorizont.Code_WG

Выводит мне полное объединеие, то есть вместо 3 записей - 9 штук.

Я пробовал так же группировать маленький join - но это явно не то.

Я где то читал что вообще нельзя группировать по таким вот ... не знаю, псевдогруппировкам.


Говоря кратка - я получаю хитрогруппированную таблицу с одним нужным кодом, и потмо мне надо привязать к ней три значения из негруппированных таблиц.

У самого уже каша в голове.
3 апр 17, 13:55    [20360777]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
j-ester,

От каши в голове помогают физические нагрузки. без шуток.

Ты задачу решить не можешь потому что сам не видишь, что ты хочешь получить - ты даже до нас мысль донести не можешь.
Проспись, обмозгуй, не решишь - приходи.

Сроки поджимают? Давай уже полные наборы данных и желаемый результат, мы специалисты, а не телепаты.
3 апр 17, 14:24    [20360939]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
В общем в правильной формулировке вопроса кроется ответ - в последнем joine выдвавлось 3 поля с разными данными - как и надо, и далее я их соединял еще с 3 данными, итого 9.

Простите за глупость, устал уже, буду дальше разбираться
3 апр 17, 14:31    [20360974]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Сформулировал: у меня свзанные таблицу по коду, к одному коду идет три записи.
На скриншоте видно, что к правому стоблцу Code_VZ привязаны три записи - так и есть. В этих записях другой таблицы содержатся еще показатели.

То есть это запрос без join, он раскоментирован но не запущен. Пока все верно

К сообщению приложен файл. Размер - 46Kb
3 апр 17, 14:52    [20361089]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Привожу тестовый запрос, который соединяет все как надо - мне нужны данные только за 2015 год. В столбике просто нет условия, но три строки за 2015 год с разными данными

К сообщению приложен файл. Размер - 65Kb
3 апр 17, 14:56    [20361112]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
j-ester
Member

Откуда: Опорный край державы
Сообщений: 34
Но в моем большом запросе с join почему то соединяет каждый с каждым.

	left join
	Voc_use_type ON bla.Code_use_type = Voc_use_type.Code_use_type
	
	left join
	dbo.VZ_correspondence ON dbo.MPV_catalogue.Code_MPV = dbo.VZ_correspondence.Code_MPV

-- Запрос плодит лишние соединения - нужна группировка или связь по другому столбцу
	
	left join
	dbo.VZ_dob_god 
	ON VZ_correspondence.Code_VZ = VZ_dob_god.Code_VZ


	where 
	dbo.VZ_dob_god.God = '2015'


Казалось бы все делаю правильно. Почему в последнем джойне идет такое соединение ???

К сообщению приложен файл. Размер - 68Kb
3 апр 17, 14:57    [20361121]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
j-ester
Но в моем большом запросе с join почему то соединяет каждый с каждым.
Казалось бы все делаю правильно. Почему в последнем джойне идет такое соединение ???

Строки из двух таблиц объединяются по условию. Удивительно, правда?
Ты делаешь все правильно*, и получаешь правильный* результат.
Но вот беда, он тебя не устраивает :)

Рекомендую обратить пристальное внимание на
ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ... ) AS rn


* интерпретация слова "правильно" зависит от ситуации и контекста...
3 апр 17, 15:24    [20361267]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по нескольким столбцам  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
и, кстати,
LEFT JOIN dbo.VZ_dob_god 
...
WHERE
  dbo.VZ_dob_god.God = '2015'

= INNER JOIN
3 апр 17, 15:28    [20361309]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить