2015-08-17 3 views
-2

у меня есть две таблицы P и G, и хотят, чтобы написать запрос, который получит последнюю дату из таблицы G и не будет тянуть в дублированных идентификаторов клиентов:SQL Server: получить последнюю дату от 2-х таблиц

Таблица P

Table P

Таблица G

Table G

Я хочу, чтобы получить этот результат из запроса:

enter image description here

До сих пор я присоединился к таблицам, но не смог получить результат задумано.

Любая помощь будет оценена по достоинству.

+1

Что ваш РЕГИСТРИРУЙТЕСЬ вид как? –

+0

Связано ли G_ID с P_ID, или это совпадение? Почему в строке для 7/15/2012 есть INFO = Y? –

ответ

0

Не знаю, как ваши таблицы связаны, кроме вашей колонки ClientID, но вы хотели бы объединить эти две таблицы на этих колонках:

select p.clientid, 
     max(g.created_on) latest_created_on, 
     max(p.info) as info 
from tableP p 
left join tableG g on p.ClientID = g.ClientID 
group by p.clientid; 

SQL Fiddle Demo

0

Вы можете использовать OVER PARTITION взять запись с самой последней датой для каждого идентификатора ClientID.

В этом случае, я хотел бы написать:

SELECT g.ClientID, 
    g.created_on, 
    g.INFO 
FROM (
    SELECT ClientID 
     created_on, 
     INFO, 
     row_number() OVER (PARTITION BY ClientID ORDER BY created_on DESC) AS RowNum 
    FROM Table_G 
    ) AS g 
WHERE g.RowNum = 1 

подзапроса создает таблицу со всеми столбцами, которые вы хотите, а функция row_number() присваивает каждую запись по row_number. PARTITION BY говорит, что нужно группировать, и ORDER BY говорит, как сортировать внутри этого раздела.

В этом случае вам нужна запись с самой последней датой для каждого идентификатора ClientID. Мы группа по ClientID, сортировать по дате, чтобы назначить номера строк, а затем в главном запросе, мы выбираем только первую строку в каждой группе, используя WHERE g.RowNum = 1

This is a guide for PostreSQL, but it's helped me understand OVER PARTITION.

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