我不确定如何标题我的问题,但这就是我要做的事情:
鉴于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
我一直在尝试子查询,但还没有找到答案,任何帮助都会非常感激。
答案 0 :(得分: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
答案 1 :(得分: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最好 - 这就是我将其用作样本的原因)。
答案 2 :(得分: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
)
答案 3 :(得分:-1)
SELECT TOP 1 [pc_tmppl_attach], [pc_tmppl_crtdt]
FROM [Given pc_tmppl_tbl]
order by pc_tmppl_crtdt desc