Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL запрос  [new]
jovani
Guest
Здравствуйте, имеется БД с четырьмя таблицами (схема прилагается) необходимо составить запрос для получения записей с максимальным значением Time для кажлого objects.ID_obj при этом объединив все таблицы.

К сообщению приложен файл. Размер - 0Kb
23 июл 09, 19:52    [7453515]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36805
group by + join вам в помощь.
23 июл 09, 19:57    [7453533]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
jovani
Guest
получилась вот такая конструкция:

SELECT Motion.ID_obj, MAX(Time) AS 'TIME', Driv.[name], MainTool.[name] FROM Motion
INNER JOIN objects ON Motion.ID_obj = objects.ID_obj
INNER JOIN MainTool ON objects.id_tool = MainTools.id
INNER JOIN Driv ON objects.id_driv = Driv.id
GROUP BY Motion.ID_obj

но она не работает ((
23 июл 09, 19:59    [7453541]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36805
jovani
получилась вот такая конструкция:

SELECT Motion.ID_obj, MAX(Time) AS 'TIME', Driv.[name], MainTool.[name] FROM Motion
INNER JOIN objects ON Motion.ID_obj = objects.ID_obj
INNER JOIN MainTool ON objects.id_tool = MainTools.id
INNER JOIN Driv ON objects.id_driv = Driv.id
GROUP BY Motion.ID_obj

но она не работает ((
Так прямо и пишет "не работаю"?
23 июл 09, 20:00    [7453544]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
jovani
Guest
выдает сообщение:

Column 'Driv.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
23 июл 09, 20:03    [7453550]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36805
Как-то так:
select
    a.ID_obj
    , a.time
    , Driv.[name]
    , MainTool.[name] 
from (

    SELECT 
        Motion.ID_obj
        , MAX(Time) AS [TIME
    FROM Motion
    GROUP BY Motion.ID_obj    
) a    
INNER JOIN objects ON a.ID_obj = objects.ID_obj
INNER JOIN MainTool ON objects.id_tool = MainTools.id
INNER JOIN Driv ON objects.id_driv = Driv.id
23 июл 09, 20:08    [7453568]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Между прочим, ответ зависит и от версии сервера. Напишите её.
23 июл 09, 20:08    [7453571]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
так можна
Guest
select
      o.ID_obj
    , Driv.[name]
    , MainTool.[name] 
    , (SELECT MAX(Time) FROM Motion m WHERE o.ID_obj=m.ID_obj) As [Time]
from  objects o
INNER JOIN MainTool 
  ON o.id_tool = MainTools.id
INNER JOIN Driv 
  ON o.id_driv = Driv.id
23 июл 09, 20:14    [7453595]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
jovani
Guest
Версия 9.00.1399.06
23 июл 09, 20:15    [7453599]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Так?
jovani
Версия 9.00.1399.06
1
;WITH CTE AS
(
 SELECT RANK()OVER(PARTITION BY o.ID_obj,o.id_tool,o.id_driv ORDER BY M.Time DESC) N,*
 FROM Motion M
 JOIN [objects] o ON M.ID_obj=o.ID_obj
 JOIN MainTool MT ON o.id_tool=MT.id
 JOIN Driv В ON o.id_driv=D.id
)
SELECT *
FROM CTE
WHERE N=1;
2
SELECT TOP 1 WITH TIES *
FROM Motion M
JOIN [objects] o ON M.ID_obj=o.ID_obj
JOIN MainTool MT ON o.id_tool=MT.id
JOIN Driv В ON o.id_driv=D.id
ORDER BY RANK()OVER(PARTITION BY o.ID_obj,o.id_tool,o.id_driv ORDER BY M.Time DESC);
23 июл 09, 20:23    [7453617]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
jovani
Guest
вот эта работает:

select
o.ID_obj
, Driv.[name]
, MainTool.[name]
, (SELECT MAX(Time) FROM Motion m WHERE o.ID_obj=m.ID_obj) As [Time]
from objects o
INNER JOIN MainTool
ON o.id_tool = MainTools.id
INNER JOIN Driv
ON o.id_driv = Driv.id

благодарность автору.
23 июл 09, 20:26    [7453625]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Хотя, может быть, вместо
PARTITION BY o.ID_obj,o.id_tool,o.id_driv
надо
PARTITION BY o.ID_obj
??
23 июл 09, 20:27    [7453628]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
так можна
Guest
jovani
вот эта работает:
...


...да вообще-то тут все работают,
ну.. кроме Вашей, стартовой..
23 июл 09, 20:29    [7453631]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
borin
Member

Откуда: angarsk/msk
Сообщений: 677
jovani
выдает сообщение:

Column 'Driv.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


ну так или вообще его убрать, или засунуть под group как просят. maintool.[name] потом также выругается
24 июл 09, 10:08    [7454640]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить