使用 MAX(日期)引入最新记录时出现问题

Problems bringing in latest record with MAX(date)

所以我以前没有遇到过这种情况,对 MAX 函数相当熟悉。我的结果集仍然显示某些值重复,但其他值不重复。

Table A:

ID  Height       DateTimePerformed
1   {170.18|67}  9/14/2013
1   {170.18|67}  9/12/2013
1   {170.18|67}  9/13/2013
2   {182.88|72}  1/13/2014
2   {182.88|72}  9/30/2013
2   {1889.76|744}    9/1/2013
2   {182.88|72} 10/21/2013
2   {182.88|72}  1/20/2014
2   {182.88|72}   3/3/2014
2   {182.88|72}  1/27/2014
2   {182.88|72}   2/3/2014
2   {182.88|72}  2/10/2014
2   {182.88|72}  12/2/2013
2   {182.88|72}   9/4/2013
2   {182.88|72} 11/18/2013
2   {182.88|72}  9/16/2013
2   {182.88|72}  10/7/2013
2   {182.88|72} 12/23/2013
2   {182.88|72}  2/17/2014

Query/Statement:

SELECT
*
FROM A
 JOIN (
    SELECT VisitID,Height,MAX(DateTimePerformed) AS 'MaxDateTimePerformed'
    FROM A
    GROUP BY VisitID,Height
    ) AS B
        ON A.VisitID=B.VisitID
            AND A.DateTimePerformed=B.MaxDateTimePerformed

结果:

ID  Height          DateTimePerformed
1   {170.18|67}     9/14/2013
2   {1889.76|744}   9/1/2013
2   {182.88|72}     3/3/2014

如果你想要的结果是:

VisitID Height      DateTimePerformed
2       {182.88|72} 2014-03-03
1       {170.18|67} 2013-09-14

然后您需要做的就是从派生的 table.

中的 select 和 group by 子句中删除 height
SELECT 
    A.*
FROM 
    A
JOIN (
    SELECT VisitID,MAX(DateTimePerformed) AS 'MaxDateTimePerformed'
    FROM A
    GROUP BY VisitID
) AS B
  ON A.VisitID=B.VisitID
 AND A.DateTimePerformed=B.MaxDateTimePerformed;

事情是这样的: 如果你查询

SELECT Height, MAX(DateTimePerformed) AS 'MaxDateTimePerformed'

那么您将获得查询中的最高日期值。它将 return 一行。

如果查询

SELECT VisitID,Height,MAX(DateTimePerformed) AS 'MaxDateTimePerformed'

您将获得每个高度的最高日期值,但是通过按 VisitID 添加和分组,您将得到一行 returned 用于每个唯一的 VisitID(您按 VisitID 分组 - 因此是一个) - 因此具有相同 VisitID 的不同高度行将 return 相同 VisitID 下的唯一高度的数量。

您需要一个子查询来获取与一列相比的最大日期值,然后通过在外部查询中自联接子查询的结果来使用这些值。

I have created a SqlFiddle for you

SELECT A.*
FROM A
INNER JOIN ( SELECT ID,MAX(DateTimePerformed) AS 'MaxDateTimePerformed'
              FROM A
              GROUP BY ID
            ) AS B
            ON A.ID=B.ID
 AND A.DateTimePerformed=B.MaxDateTimePerformed
 Order by A.ID ASC

您可以使用分析函数 ROW_NUMBER() 来 select 通过特定的 MAX/MIN 条件,每个 id 只有一行,方法是在内部使用 ORDER BY。例如:

SELECT B.* FROM
   (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DateTimePerformed DESC) AS RN, a.* 
    FROM A a
   ) AS B
WHERE B.RN=1
 Order by B.ID ASC

在这个例子中,您将只有一个记录,每个 ID 都有最大日期。如果同一 ID 的同一日期有多个记录,则只返回一个。

此外,您可以在 OVER 子句中指定 ORDER BY DateTimePerformed DESC,Height DESC 以 select 记录最大 DateTimePerformed 和 Height。

Sqlfiddle