Хорошо, я обновил свой ответ. Вот решение, которое будет работать на основе запроса, который я сделал ранее:
DECLARE @Name VARCHAR(100)
DECLARE @TmpName VARCHAR(100)
DECLARE @ID INT
DECLARE @CoNum INT
DECLARE @Date1 DATETIME
DECLARE @Date2 DATETIME
DECLARE @Date3 DATETIME
DECLARE @Value1 INT
DECLARE @Value2 INT
DECLARE @Value3 INT
DECLARE @IndexValue INT
DECLARE @SetValue INT
DECLARE @SetDate DATETIME
CREATE TABLE #OutputTable (
co_number INT,
Client_Name VARCHAR(200),
Date1 DATETIME,
Value1 INT,
Date2 DATETIME,
Value2 INT,
Date3 DATETIME,
Value3 INT
)
SELECT DISTINCT Client_name INTO #TempVitalNames FROM vital ORDER BY Client_name
WHILE (SELECT COUNT(*) FROM #TempVitalNames) > 0
BEGIN
SELECT @IndexValue = 0
SELECT TOP(1) @TmpName = Client_name FROM #TempVitalNames
SELECT TOP(3) * INTO #TempVital FROM vital WHERE Client_name = @TmpName ORDER BY taken_date DESC
WHILE (@IndexValue < 3)
BEGIN
SET @Name = (SELECT TOP 1 Client_name FROM #TempVital)
SET @CoNum = (SELECT TOP 1 co_number FROM #TempVital)
SELECT TOP 1 @ID = id FROM #TempVital
SET @SetDate = (SELECT TOP 1 taken_date FROM #TempVital)
SET @SetValue = (SELECT TOP 1 taken_value FROM #TempVital)
DELETE FROM #TempVital WHERE id = @ID
SET @Date1 = CASE WHEN @IndexValue = 0 THEN @SetDate ELSE @Date1 END
SET @Date2 = CASE WHEN @IndexValue = 1 THEN @SetDate ELSE @Date2 END
SET @Date3 = CASE WHEN @IndexValue = 2 THEN @SetDate ELSE @Date3 END
SET @Value1 = CASE WHEN @IndexValue = 0 THEN @SetValue ELSE @Value1 END
SET @Value2 = CASE WHEN @IndexValue = 1 THEN @SetValue ELSE @Value2 END
SET @Value3 = CASE WHEN @IndexValue = 2 THEN @SetValue ELSE @Value3 END
SELECT @IndexValue = @IndexValue + 1
END
INSERT INTO #OutputTable (co_number, Client_Name, Date1, Value1, Date2, Value2, Date3, Value3)
( SELECT @CoNum, @Name, @Date1, @Value1, @Date2, @Value2, @Date3, @Value3 )
DELETE #TempVitalNames WHERE Client_name = @TmpName
DROP TABlE #TempVital
END
DROP TABLE #TempVitalNames
SELECT * FROM #OutputTable
DROP TABLE #OutputTable
Хорошо, Клаудия. Это сначала вытянет все уникальные имена в таблице во временную таблицу. Затем он будет перебирать каждое имя. Внутри итерационного цикла она будет делать то же, что и моя последняя программа, извлекать нужные даты из верхних трех имен и вставлять их в другую временную таблицу. После того как все имена будут обработаны, он выведет содержимое временной таблицы, которая должна быть результатом, который вы ищете. Я запустил этот запрос в моей системе с предоставленными вами данными теста, и он был выполнен менее чем за 1 секунду. Я знаю, что у вас, вероятно, гораздо больше строк, чем мне приходилось работать, но, похоже, это работает довольно хорошо. Если вам нужно что-то еще, дайте мне знать, и я изменю это соответственно Вы можете добавлять любые дополнительные операторы where к операторам SELECT, если это необходимо. Вам также может понадобиться изменить некоторые типы данных. Я не был уверен, было ли ваше take_value целым, десятичным или чем-то еще. Я пошел с INT, но вы можете изменить его в соответствии с вашими потребностями.