我正在尝试将此SQL查询转换为NHibernate解决方案:
SELECT MIN(TopTimes.StartTime)
FROM (SELECT TOP 100 StartTime FROM Pack ORDER BY StartTime DESC) AS TopTimes
有效地为最后一个X(在本例中为100)启动包我想知道最小StartTime
是什么。这似乎并不复杂,但在2小时谷歌搜索之后,我无法以某种方式绕过它。
到目前为止,我有这样的子查询:
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
这不是我需要的。
答案 0 :(得分:0)
根据您对该问题的评论。你根本不需要使用'MIN'。
'MIN'会返回一个结果。如果您有一些标准,使用分组,那么您可以返回每个组的最小值。但根据您的信息,这不是必需的。
目前你正在使用DESC(Descending),它会列出从最新到最旧的日期,所以你最终会说:
的 2011-06-15
2011-05-18
2011-05-13
2011-04-07 强> 的
您想要更新您的查询以使用ASC(升序),以便您首先获得最早的日期,这将给您相同的结果,如:
的 2011-04-07
2011-05-13
2011-05-18
2011-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个结果的最低/最早单日结果。