-1

我有一张这样的桌子

Col1   Col2  Mindate                        MaxDate 
A       B    12-04-2012 00:12:00:087        31-04-2012 00:00:01:001
C       D    01-01-2011                     30-01-2011 
A       B    09-05-2012                     27-05-2012
A       B    11-07-2012                     21-07-2012

我只在第一行插入了日期时间,但为简洁起见在其他行中省略了,所有日期列都是日期时间。

假设我已经插入了 A 和 B 的最后一条记录(Col1 和 Col2 是组合键)。现在我想要基于以上情况下的思维定势的 A 和 B 的最后记录

A       B    09-05-2012                     27-05-2012

我正在尝试以下查询:

SELECT * FROM tbl WHERE Col1 ='A' AND Col2='B' AND ....
4

4 回答 4

1

可以通过Mindate对表格进行降序排序,得到rank 2对应的记录。

SELECT t1.*
FROM
    table t1
    JOIN (SELECT Col1, Col2, RANK() OVER (ORDER BY Mindate DESC) 'Rank' 
          FROM table
          WHERE Col1 = 'A' AND col2 = 'B'
    ) as t2
ON t1.Col1 = t2.Col1 AND t1.col2 = t2.col2 AND t1.rank = 2
于 2012-10-26T09:31:31.357 回答
1

性能不是很好,但应该做的工作

SELECT * FROM tbl 
WHERE Col1 ='A' AND Col2='B'
AND mindate = (select max(mindate) from tbl where Col1 = 'A' AND Col2='B')
于 2012-10-26T09:32:51.570 回答
1

您可以使用ROW_NUMBER

WITH CTE AS
(
   SELECT Col1, Col2, Mindate, MaxDate
    , RN = ROW_NUMBER() OVER (PARTITION BY Col1, Col2 ORDER BY Mindate DESC)
   FROM dbo.Tbl
   WHERE COL1='A' AND COL2='B'
)
SELECT Col1, Col2, Mindate, MaxDate
FROM CTE 
WHERE RN = 2

这将根据 Mindate 和给定的键返回倒数第二条记录。

于 2012-10-26T09:35:58.477 回答
-3
SELECT * FROM tbl WHERE Col1 ='A' AND Col2='B' AND Mindate = MAX(Mindate)
于 2012-10-26T09:31:27.460 回答