Выберите минимум подзапроса в NHibernate - PullRequest
0 голосов
/ 03 августа 2011

Я пытаюсь перевести этот SQL-запрос в решение NHibernate:

SELECT MIN(TopTimes.StartTime)
FROM (SELECT TOP 100 StartTime FROM Pack ORDER BY StartTime DESC) AS TopTimes

Эффективно для последних X (в данном случае 100) запущенных пакетов. Я хочу знать, каков минимум StartTime.Это не кажется сложным, но после двухчасового поиска в Google я не могу как-то обернуться вокруг него.

У меня есть такой подзапрос, как этот:

DetachedCriteria.For<Pack>()
    .SetProjection(Projections.Property("StartTime"))
    .SetMaxResults(100)
    .AddOrder(Order.Desc("StartTime"));

Но я не уверенкак объединить это с Projections.Min

Обновление : Чтобы уточнить немного:

Пример: Пусть select StartTime from Pack вернет следующий результат:

2011-08-05 09:05:04.000
2011-08-05 08:05:04.000
2011-08-05 06:05:04.000
2011-08-05 05:05:04.000
2011-08-05 07:05:04.000

Я хочу сохранить 2 самых последних времени запуска:

SELECT TOP 2 StartTime FROM Pack ORDER BY StartTime DESC

, что возвращает:

2011-08-05 09:05:04.000
2011-08-05 08:05:04.000

Тогда я беру минимум, равный 2011-08-05 08:05:04.000и это то, что мне нужно.

Предлагаемое select top 2 StartTime from Pack order by StartTime ASC вернет:

2011-08-05 05:05:04.000
2011-08-05 06:05:04.000

, а это не то, что мне нужно.

1 Ответ

0 голосов
/ 04 августа 2011

На основании ваших комментариев по вопросу.Вам не нужно использовать «MIN» вообще.

«MIN» вернет вам один результат.Если у вас есть какие-то критерии с группировкой, вы можете вернуть минимальное значение для каждой группы.Но, основываясь на вашей информации, это не требуется.

В данный момент вы используете DESC (По убыванию), который будет перечислять даты от самых новых до самых старых, поэтому в итоге вы скажете:

2011-06-152011-05-182011-05-132011-04-07

Вы хотите обновить свой запрос, чтобы использовать ASC (по возрастанию), чтобы сначала вы получили самую старую дату, которая даст вам такие же результаты, как:

2011-04-072011-05-132011-05-182011-06-15

Чтобы обновить ваш запрос, все, что вам нужно сделать, это:

DetachedCriteria.For<Pack>()
    .SetProjection(Projections.Property("StartTime"))
    .SetMaxResults(100)
    .AddOrder(Order.Asc("StartTime"));

Если вам нужно это как подзапрос, тогда вы можетепредоставьте больше информации.


Итак, вы хотите заказать все результаты и взять минимальную дату из этого?

Тогда вы можете сделать:

DetachedCriteria.For<Pack>()
    .SetProjection(Projections.Min(Projections.Property("StartTime")))
    .SetMaxResults(100)
    .AddOrder(Order.Desc("StartTime"));

Это даст вам самый низкий / самый старый результат одной даты из последних 100 результатов результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...