使用SQL获取不同的最大日期

问题描述

| 我不确定如何为我的问题加上标题,但这是我想做的事情: 给定pc_tmppl_tbl
pc_tmppl_attach pc_tmppl_val1    pc_tmppl_crtdt

AJC05-06    AJCINT       2005-08-15 10:32:03.790
AJC06-07    AJCINT       2006-10-17 10:02:06.570
AJC07-08    AJCINT       2007-06-13 10:44:53.573
AJC08-09    AJCINT       2008-06-27 09:51:17.290
AJC09-10    AJCINT       2009-07-20 14:26:06.270
AJC10-11    AJCINT       2010-08-26 11:54:32.777
AJC99-001   AJCINT       2005-05-30 19:30:51.623
ALPI05-06   ALPINE       2005-05-30 19:30:51.623
ALPI07-08   ALPINE       2006-12-11 13:57:09.923
ALPI07-08   ALPINE       2007-05-24 14:04:07.867
ALPI08-09   ALPINE       2008-04-30 09:49:24.140
我希望它返回pc_tmppl_crtdt及其对应的pc_tmppl_attach的最大日期,因此
ALPI08-09   ALPINE       2008-04-30 09:49:24.140
AJC10-11    AJCINT       2010-08-26 11:54:32.777
我一直在尝试子查询,但尚未完全解决问题,我们将不胜感激。     

解决方法

Select T.pc_tmppl_attach,T.pc_tmppl_val1,T.pc_tmppl_crtdt
From pc_temppl_tbl As T
    Join    (
            Select pc_tmppl_val1,Max( T1.pc_tmppl_crtdt ) As MaxDateTime
            From pc_temppl_tbl As T1
            Group By T1.pc_tmppl_val1
            ) As Z
        On Z.pc_tmppl_val1 = T.pc_tmppl_val1
            And Z.MaxDateTime = T.pc_tmppl_crtdt
    ,您没有定义要使用的服务器和版本-如果您使用的是SQL Server 2005或更高版本,则可以使用CTE(公用表表达式)和排名功能-类似于:
;WITH PartitionedData AS
(
   SELECT 
       pc_tmppl_attach,pc_tmppl_val1,pc_tmppl_crtdt,ROW_NUMBER() OVER(PARTITION BY pc_tmppl_val1 
                         ORDER BY pc_tmppl_crtdt DESC) AS \'RowNumber\'
  FROM dbo.pc_tmppl_tbl
)
SELECT
   pc_tmppl_attach,pc_tmppl_crtdt
FROM
   PartitionedData
WHERE
   RowNumber = 1
基本上,CTE(内部选择)所做的就是从表中获取所有数据,将其按列
pc_tmppl_val1
进行分区-因此
pc_tmppl_val1
的每组值均从1开始倒数-并按
pc_tmppl_crtdt
降序对这些条目进行排序-最新的条目为第一。 因此,对于每个
pc_tmppl_val1
值,最新的条目是带有
RowNumber = 1
的条目,这就是外部
SELECT
(基于CTE)为您提供的内容。 CTE和排名功能也非常灵活-如果您需要为每个
pc_tmppl_val1
值添加前3个条目,只需将外部
WHERE
条件更改为
WHERE RowNumber <= 3
完成了! CTE(公用表表达式)和排名函数是ANSI SQL标准-因此,除了Microsoft SQL Server之外,其他数据库也支持它(我最了解SQL Server,这就是为什么我将其用作示例)。     ,使用关联查询(适用于大多数sql数据库):
SELECT pc_tmppl_attach,pc_tmppl_crtdt
FROM pc_tmppl_tbl AS tbl_ext
WHERE pc_tmppl_crtdt = (
                        SELECT MAX(tbl_int.pc_tmppl_crtdt)
                        FROM pc_tmppl_tbl AS tbl_int
                        WHERE tbl_int.pc_tmppl_val1 = tbl_ext.pc_tmppl_val1
                       )
    ,
SELECT TOP 1 [pc_tmppl_attach],[pc_tmppl_crtdt]
FROM [Given pc_tmppl_tbl]
order by pc_tmppl_crtdt desc