2015-10-16 5 views
0

У меня есть таблица wo_records, чтобы иметь возможность извлечь текущий рабочий заказ для каждой машины со временем начала.Подпроцесс SQL Server 2005

Я написал этот запрос ранжировать каждый записи и дает последняя запись ранг 1, но я не могу гнездо там, где я могу использовать ИНЕКЕ (where rank =1)

SELECT 
    *, 
    RANK() OVER (PARTITION BY get_address ORDER BY t_start desc) AS Last_value 
FROM 
    wo_records 

Выход:

ndx|Wo  | t_start     |t_end    | get_address| Rank 
-------------------------------------------------------------------------------- 
45 12521231 2019-01-07 15:41:24.000 NULL     44   1 
46 12521231 2018-01-08 15:42:24.000 2018-01-08 15:47:24.000 44   2 
39 12521231 2016-01-21 15:43:24.000 2016-01-21 15:49:24.000 44   3 

Каков правильный способ вложить этот оператор для извлечения только строк с рамом = 1?

Спасибо,

ответ

1

Если я что-то не хватает, все, что вы ищете это?

Select * 
From  
(
    Select *, 
      RANK() over (PARTITION BY get_address order by t_start desc) AS Last_value 
    From wo_records 
) As A 
Where A.Last_value = 1 
+0

Да, что именно «AS A» делает точно? – Jad

+1

Он псевдонизирует подзапрос, чтобы на него можно было ссылаться. – Siyual

+0

Я пытался сделать то же самое с INTO #temp, – Jad

2

Siyual ответ выглядит великолепно.

Я просто хочу показать вам о CTE. Таким образом, вы можете иметь несколько деривативных таблиц также с псевдонимом и легко читаемыми.

WITH alias1 AS (
    Select *, 
      RANK() over (PARTITION BY get_address order by t_start desc) AS Last_value 
    From wo_records 
), 
anotherAlias AS (
    SELECT * .... 
) 
Select * 
From alias1 A -- optional can also include [anotherAlias] 
Where A.Last_value = 1