2013-03-04 74 views
1

以下代码用于Sql Server。
但我不能让它正常工作;状态不会按顺序排列,并且首先显示最新的状态。
我该如何解决它?按组排列分组项目

<% 
    SQL = "SELECT S.MEMBERID, S.StatusMessage, S.StatusPlace, S.StatusCity, S.StatusDateEntered" 
    SQL = SQL & " FROM STATUSES S" 
    SQL = SQL & " GROUP BY S.MEMBERID" 
    SQL = SQL & " ORDER BY S.StatusDateEntered DESC" 
    Set objStatuses = objConn.Execute(SQL) 
%> 
+4

我发现很难相信* THAT *代码用于Sql Server。 – 2013-03-04 22:19:35

+0

你是什么意思,他们'不会按顺序?您按正确的列排序,假设StatusDateEntered是时间戳 – 2013-03-04 22:20:25

+0

StatusDateEntered是日期时间字段。如果我通过声明删除组,它会正确地排序数据。 – Efe 2013-03-04 22:22:05

回答

0

迈克尔非常感谢您的帮助。 我刚刚发现了LIMIT子句。 它也做到了。

SQL = "SELECT S.MEMBERID, S.StatusMessage, S.StatusPlace, S.StatusCity, S.StatusDateEntered" 
    SQL = SQL & " FROM STATUSES S" 
' SQL = SQL & " GROUP BY S.MEMBERID" 
    SQL = SQL & " ORDER BY S.StatusDateEntered DESC LIMIT 1" 
    Set objStatuses = objConn.Execute(SQL) 
3

您的代码不工作,因为你在做MEMBERIDGROUP,但你不上汇聚任何非分组的列的......,让你只为每隔一列一个随机值每个MEMBERID ...这不一定是最近的。接下来,您正在通过这些混杂的数据进行订购,这不是您所期望的。

要解决这个问题,你需要做一个的GroupWise-MAX,它可以作为一个JOIN能够高效地实现到包含MAX(StatusDateEntered)每个MEMBERID一个子查询:

SELECT 
    S.MEMBERID, 
    S.StatusMessage, 
    S.StatusPlace, 
    S.StatusCity, 
    S.StatusDateEntered 
FROM 
    STATUSES S 
    JOIN (
     SELECT MEMBERID, MAX(S2.StatusDateEntered) AS MaxStatusDateEntered 
     FROM STATUSES 
     GROUP BY MEMBERID 
    ) S2 
     ON S.StatusDateEntered = S2.MaxStatusDateEntered 
     AND S.MEMBERID = S2.MEMBERID 
ORDER BY S.StatusDateEntered DESC 
+0

这很棒,但我可以简单地在SQL Server中使用TOP 1。我可以像这样优化此代码吗? – Efe 2013-03-04 22:40:43