2015-01-31 5 views
0

Я не могу думать о том, как построить SQL-запрос, который соответствует моим потребностям, если это просто невозможно, сообщите мне.sql заявление подзапроса с соединением

У меня есть таблица, как это (плохо ommit столбцы не делая dificulties мне)

стол: SERVICIO

------------------------------------------------------------ 
id | swo |  date    | issueValue | 

1 | 15-001 | 2015-01-29 01:52:59  |  2 

1 | 15-002 | 2015-01-30 01:24:00 |  2 

------------------------------------------------------------ 

таблицы: комментарии

------------------------------------------------------------ 
id | swo |  date    | Area | 

1 | 15-001 | 2015-01-29 01:52:59  |  2 

1 | 15-002 | 2015-01-30 01:24:00  |  1 

1 | 15-002 | 2015-01-30 01:50:00 |  3 

------------------------------------------------------------ 

я хочу, чтобы выбрать ряды в servicio, но включают в себя последнюю область, назначенную каждому swo. результат должен быть примерно таким.

------------------------------------------------------------ 
id | swo |  date    | Area | 

1 | 15-001 | 2015-01-29 01:52:59  |  2 

1 | 15-002 | 2015-01-30 01:24:00 |  3 

------------------------------------------------------------ 

так как я могу сделать проверку оператора sql для верхнего (1) и вернуть значение площади в нем?

+0

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

+0

извините, отредактировал теги –

ответ

1

В SQL Server вы можете сделать это с помощью apply, подзапроса или row_number(). Вот первый способ:

select s.*, c.area 
from servicio s outer apply 
    (select top 1 c.* 
     from comments c 
     where c.swo = s.swo 
     order by c.date desc 
    ) c; 

С помощью этого метода вы можете вытащить дополнительные столбцы, если хотите.

+0

работал как шарм, спасибо, –

0

Это решение с Rownumber и подзапросом. В подзапросе вы выбираете все строки, которые соответствуют таблицам. Создание возрастания для столбца даты таблицы комментариев, разбиение на разделы для каждого SWO (Partitioning означает, что он будет сбросить счетчик на каждом SWO). 1 = Последняя дата для конкретного SWO. В финале выбора вы просто положить ИНЕКЕ с RowNum = 1

SELECT swo ,date ,issueValue ,Area 
FROM 
(SELECT 
    SRV.swo 
    ,SRV.date 
    ,SRV.issueValue 
    ,CMNT.Area 
    ,ROW_NUMBER() OVER (PARTITION BY CMNT.swo ORDER BY CMNT.date DESC) AS Dsc_Rank 
FROM servicio AS SRV 
LEFT JOIN comments AS CMNT 
     ON (SRV.swo=CMNT.swo) 
) AS Temp 
WHERE Temp.Dsc_Rank = 1 /* Descending Date Rank 1 = Latest date from Comment table*/ 

Примечание: например, в Teradata можно опустить подпункт запрос и использовать Квалифицируйтесь Пунктом

Смежные вопросы