1

我不确定如何为我的问题命名,但这是我想要做的:

给定 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

我一直在尝试子查询,但还没有完全找到答案,任何帮助将不胜感激。

4

4 回答 4

3
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
于 2011-04-13T21:20:16.387 回答
2

您没有定义您使用的服务器和版本 - 如果您使用的是 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_val1, 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 最好 - 这就是我使用它作为示例的原因)。

于 2011-04-13T20:58:55.183 回答
1

使用相关查询(应该适用于大多数 sql 数据库):

SELECT pc_tmppl_attach,pc_tmppl_val1, 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
                       )
于 2011-04-13T21:01:44.400 回答
-1
SELECT TOP 1 [pc_tmppl_attach], [pc_tmppl_crtdt]
FROM [Given pc_tmppl_tbl]
order by pc_tmppl_crtdt desc
于 2011-04-13T21:04:39.750 回答