2010-09-14 2 views
2

Учитывая 2 таблицыSQL помогите пожалуйста - получить Активности для клиента

CustomerActivity 
CustomerId, ActivityId, CreatedOnDate 
1, 1, 8/1/2010 
1, 2, 8/15/2010 
2, 1, 7/24/2010 
2, 2, 8/15/2010 

TempUpdateTable 
CustomerId, RecentActivityDate 
1, NULL 
2, NULL 

Как заполнить я в провалов в TempUpdateTable, используя таблицу CustomerActivity?

Моя первая попытка не выгорело:

UPDATE [TempUpdateTable] 
SET RecentActivityDate = 
(SELECT MAX(CreatedOnDate) FROM CustomerActivity CA WHERE CA.CustomerId = CustomerId) 

Спасибо,

стержень.

ответ

2

Вы также можете попробовать это:

UPDATE [TempUpdateTable] 
SET RecentActivityDate = Customers.MaxCreatedDate 
FROM 
(SELECT MAX(CreatedOnDate) as MaxCreatedDate, CA.CustomerId 
FROM CustomerActivity CA WHERE CA.CustomerId = CustomerId 
GROUP BY CA.CustomerId 
) Customers 
WHERE TempUpdateTable.CustomerId = Customers.CustomerId 
2

Попробуйте это:

;with LatestActivity as 
(
select CustomerId, max(CreatedOnDate) LastActivityDate 
from CustomerActivity ca 
group by CustomerId 
) 
update tut 
set tut.RecentActivityDate = la.LastActivityDate 
from TempUpdateTable tut 
join LatestActivity la on tut.CustomerId = la.CustomerId 
3

Вы можете использовать CTE (Common Таблица Expression), чтобы найти последнюю активность для каждого клиента:

;WITH LastActivity AS 
(
    SELECT 
     CustomerID, ActivityID, CreatedOnDate, 
     ROW_NUMBER() OVER(PARTITION BY CustomerId ORDER BY CreatedOnDate DESC) 'RowNum' 
    FROM 
     dbo.CustomerActivity 
) 
SELECT * FROM LastActivity 
WHERE RowNum = 1 

Это даст вам одну строку для каждого клиента с активностью, имеющей самую последнюю дату. PARTITION BY разделяет ваши данные клиентом, например. счетчик начинается с 1 снова для каждого нового клиента. ORDER BY определяет порядок убывания по дате, так что последний/Новейший деятельность является первым один, с номером строки 1.

Теперь вы можете использовать CTE обновить другую таблицу:

;WITH LastActivity AS 
(
    SELECT 
     CustomerID, ActivityID, CreatedOnDate, 
     ROW_NUMBER() OVER(PARTITION BY CustomerId ORDER BY CreatedOnDate DESC) 'RowNum' 
    FROM 
     dbo.CustomerActivity 
) 
UPDATE dbo.TempUpdateTable 
SET RecentActivityDate = act.CreatedOnDate 
FROM LastActivity act 
WHERE dbo.TempUpdateTable.CustomerId = act.CustomerID 
AND act.RowNum = 1 
0

Хотя немного поздно, может быть, это простой ответ!

SELECT ProjectID, StoreID, MAX(Date) AS Expr1, MAX(ActivityID) AS Expr2 
FROM dbo.ProjectUpdates 
GROUP BY ProjectID, StoreID 

Это последнее мероприятие, выполненное в проекте магазина мудро.

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