Или, если Вы хотите пойти твердым путем, добавьте ссылку на свой проект для Microsoft. VisualBasic и затем используют следующее:
Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(fromDirectory, toDirectory);
Однако использование одной из рекурсивных функций является лучшим способом пойти, так как это не должно будет загружать VB dll.
Вы хотите использовать для этого ROW_NUMBER () или RANK ().
(и убедитесь, что что предыдущий запрос заканчивается точкой с запятой)
with ranked as
(
select *, row_number() over (partition by key order by val desc) as bestrow
from sometableorquery
)
select *
from ranked
where bestrow = 1
order by key;
Если вам нужны связи (чтобы ключ, имеющий два лучших значения, возвращал оба), используйте rank () вместо row_number ().
Роб
Есть, но это, конечно, не очевидно:
select
*
from
(
select
key,
val,
col,
max(val) over (partition by key) as MaxVal
from
tableA
)
where
val = MaxVal
Использование предложения over
- отличный способ сделать это и не требует никаких посторонних подзапросов. Все, что он делает, это берет максимальное значение
для каждого ключа, а затем обертывает этот набор результатов в подзапрос, где мы можем сравнить значение
с MaxVal
, чтобы получить уверен, что мы выбираем правильную строку.
Намного чище и быстрее, чем выполнение до трех подзапросов!
Я бы выделил ваши подзапросы во временные таблицы, прежде чем выбирать из них. Думаю, от этого вы заметите значительный прирост производительности.