Смотрите на это - который мог бы объяснить его:
В целом. То, что называют "первым хитом" на Веб-сайте ASP.NET, обычно занимает время, из-за компиляции и создания AppDomain.
Каждый раз, когда Вы развертываете сайт - удостоверяются, что использовали, "Публикуют Веб-сайт" функция в Visual Studio, чтобы предварительно скомпилировать Ваш веб-сайт. Тогда "первый хит" штраф уменьшается. И не забудьте устанавливать конфигурацию для Выпуска, и не Отладка!
Это почти тот же вопрос, но на него есть несколько ответов!
Вот я моделирую вашу таблицу:
declare @Borg table (
ID int,
Foo int,
Bar int,
Blagh int
)
insert into @Borg values (1,10,20,30)
insert into @Borg values (2,10,5,1)
insert into @Borg values (3,20,50,70)
insert into @Borg values (4,20,75,12)
Затем вы можете выполнить анонимное внутреннее соединение, чтобы получить данные, которые вам нужны.
select B.* from @Borg B inner join
(
select Foo,
MIN(Bar) MinBar
from @Borg
group by Foo
) FO
on FO.Foo = B.Foo and FO.MinBar = B.Bar
РЕДАКТИРОВАТЬ Адам Робинсон услужливо указал, что «это решение может возвращать несколько строк, когда минимальное значение Bar дублируется, и исключает любое значение foo, где bar равно null
"
В зависимости от вашего сценария использования повторяющиеся значения, в которых дублируется Bar, могут быть действительными - если вы хотите найти все значения в Borg, где Bar был минимальным, то наличие обоих результатов кажется правильным решением.
Если вам нужно захватить NULL
в поле, по которому выполняется агрегирование (в данном случае по MIN),тогда вы можете объединить
NULL с приемлемо высоким (или низким) значением (это уловка):
...
MIN(coalesce(Bar,1000000)) MinBar -- A suitably high value if you want to exclude this row, make it suitably low to include
...
Или вы можете выбрать UNION и прикрепить все такие значения к нижней части вашего набора результатов.
on FO.Foo = B.Foo and FO.MinBar = B.Bar
union select * from @Borg where Bar is NULL
Последний не будет группировать значения в @Borg с одинаковым значением Foo
, потому что он не знает, как выбирать между ними.
select
ID,
Foo,
Bar,
Blagh
from Table
join (
select
ID,
(row_number() over (order by foo, bar) - rank() over (order by foo)) as rowNumber
) t on t.ID = Table.ID and t.rowNumber = 0
Это снова присоединяется к таблице, но на этот раз добавляет относительный номер строки для значения для bar
, как если бы они были отсортированы по возрастанию в пределах каждого значения foo
. Путем фильтрации по rowNumber = 0
он выбирает только самые низкие значения для bar
для каждого значения foo
. Это также эффективно устраняет группу по предложению
, поскольку теперь вы получаете только одну строку для каждого foo
.
Насколько я понимаю, вы не можете сделать это за один раз.
select Foo, min(Bar) from table group by Foo
,, дает вам минимальный Bar для каждого отдельного Foo. Но вы не можете связать этот минимум с конкретным идентификатором, потому что может быть более одной строки с этим значением Bar.
Вы можете сделать что-то вроде этого:
select * from Table t
join (
select Foo, min(Bar) as minbar
from Table group by Foo
) tt on t.Foo=tt.Foo and t.Bar=tt.minbar
Обратите внимание, что если там , будет более одной строки с минимальным значением Bar, вы получите их все с помощью вышеуказанного запроса.
Я не утверждаю, что я гуру SQL, и сейчас уже поздно, и я могу быть чего-то не хватает, но есть мои 0,02 доллара :)
Это может помочь:
DECLARE @Table TABLE(
ID INT,
Foo FLOAT,
Bar FLOAT,
Blah FLOAT
)
INSERT INTO @Table (ID,Foo,Bar,Blah) SELECT 1, 10 ,20 ,30
INSERT INTO @Table (ID,Foo,Bar,Blah) SELECT 2, 10 ,5 ,1
INSERT INTO @Table (ID,Foo,Bar,Blah) SELECT 3, 20 ,50 ,40
INSERT INTO @Table (ID,Foo,Bar,Blah) SELECT 4, 20 ,75 ,12
SELECT t.*
FROM @Table t INNER JOIN
(
SELECT Foo,
MIN(Bar) MINBar
FROM @Table
GROUP BY Foo
) Mins ON t.Foo = Mins.Foo
AND t.Bar = Mins.MINBar
Другим вариантом может быть что-то вроде следующего:
DECLARE @TEST TABLE( ID int, Foo int, Bar int, Blagh int)
INSERT INTO @TEST VALUES (1,10,20,30)
INSERT INTO @TEST VALUES (2,10,5,1)
INSERT INTO @TEST VALUES (3,20,50,70)
INSERT INTO @TEST VALUES (4,20,75,12)
SELECT Id, Foo, Bar, Blagh
FROM (
SELECT id, Foo, Bar, Blagh, CASE WHEN (Min(Bar) OVER(PARTITION BY FOO) = Bar) THEN 1 ELSE 0 END as MyRow
FROM @TEST) t
WHERE MyRow = 1
Хотя для этого все еще требуется подзапрос, он устраняет необходимость в объединениях.
Еще один вариант.