使用 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。
所以我以前没有遇到过这种情况,对 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。