2016-01-28 2 views
0

У меня есть проблема с 2 часть, где за счет использования Google удалось найти ответ на первую часть в SQL get the last date time recordSQL-запрос сервера для соединения двух таблиц

пользователя Osy код работы очень хорошо для меня ,

Код Оси ниже!

select filename, dates, status 
from yt a 
where a.dates = (select max(dates) 
        from yt b 
        where a.filename = b.filename) 

Запрос возвращает только последние даты для каждого имени файла.

Если бы я мог просто придерживаться того же примера вопроса, что и url выше.

Это таблица, используемая в данном примере:

yt стол:

+---------+------------------------+-------+ 
|filename |Dates     |Status | 
+---------+------------------------+-------+ 
|abc.txt |2012-02-14 12:04:45.397 |Open | 
|abc.txt |2012-02-14 12:14:20.997 |Closed | 
|abc.txt |2013-02-14 12:20:59.407 |Open | 
|dfg.txt |2012-02-14 12:14:20.997 |Closed | 
|dfg.txt |2013-02-14 12:20:59.407 |Open | 
+---------+------------------------+-------+ 

Вторая часть проблемы:

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

Table2

+--------+--------+ 
|filename |ref  | 
+---------+--------+ 
|abc.txt |Heating | 
|dfg.txt |Cooling | 
+---------+---- ---+ 

Результат, который я пытаюсь добиться от запроса следующим образом, используя код осы в выше, чтобы вернуться только последним для каждой записи на устройство, а затем отобразить реф колонка и не отображать имя файла

Пример:

+---------+------------------------+-------+ 
|ref  |Dates     |Status | 
+---------+------------------------+-------+ 
|Heating |2013-02-14 12:20:59.407 |Open | 
|Cooling |2013-02-14 12:20:59.407 |Open | 
+---------+------------------------+-------+ 

Я могу использовать внутреннее соединение непосредственно на таблице yt, но не могу получить это комбинат (гнездо) с кодом от Osy выше.

Использование SQL Server 2012. Пожалуйста, дайте мне знать, если я что-то упустил.

спасибо.

+0

вам НЕ НУЖНО «гнездо» соединения. просто добавьте оператор объединения в родительский/внешний запрос, как и любое другое соединение. –

+0

Что вы имеете в виду, когда говорите, что «не можете получить, это совместить (гнездо) с кодом от Osy выше»?? Вы получили сообщение об ошибке? Пожалуйста, разместите свою попытку сделать это, и что было не так с результатом. –

ответ

0

Продолжая Опубликованный пример код, снова выполнить еще один JOIN с Table2 как

select t2.ref, xx.Dates, xx.Status 
from Table2 t2 join (
select filename, dates, status 
from yt a where a.dates = (
select max(dates) 
from yt b 
where a.filename = b.filename 
)) xx on t2.filename = xx.filename; 
+0

Спасибо, Рахул, мне удалось проверить ваш запрос на моих столах прошлой ночью, прежде чем власть погасла (третий мир третьего мира), который должен был выполнить большую часть моей работы этим утром. Обновленный код на [SQLFiddle] (http://sqlfiddle.com/#!3/93dcb/1) – Colduldel

0

спекулирует нижний запрос, но это должно работать:

SELECT a.ref, MAX(b.Dates), b.Status 
FROM Table2 AS a INNER JOIN yt AS b ON a.ref=b.filename AND b.Status='Open' 
GROUP BY a.ref, b.Status 

Позволь мне знать, если он работает

+0

Это даст вам 2 записи для каждого 'ref', так как есть 2' status' и max 'date' для каждого status – JamieD77

+0

Затем измените 'INNER' на' RIGHT' –

+0

Dankie Steven, просто быстро по вашему запросу, похоже, не вернул результат. завтра еще завтра, и обновите мой комментарий. Спасибо за ваше время. – Colduldel

1

Это может быть более быстрый способ сделать это.

SELECT [ref], 
     [dates], 
     [status] 
FROM (SELECT a.[filename], 
       a.[dates], 
       a.[status], 
       t2.[ref], 
       ROW_NUMBER() OVER (PARTITION BY a.[filename] ORDER BY a.[dates] DESC) [Rn] 
     FROM yt a 
       JOIN Table2 t2 ON a.[filename] = t2.[filename] 
     ) t 
WHERE t.Rn = 1   
+0

Ваше решение отлично работает. Спасибо, дает мне другую точку зрения! – Colduldel

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