选择具有最高日期的行

时间:2011-05-15 20:32:37

标签: mysql sql hibernate postgresql

我有一些值在我的表中重复,我想只选择那些具有最新/最高日期的值,即:

ID   Type     Name      Value        Date
--  -------   -----    -------       -------------
1   "FRUIT"  "APPLE"  "Imported"  "2011-03-19 22:08:13"
5   "FRUIT"  "LEMON"  "Imported"  "2011-03-19 22:00:44"
22  "FRUIT"  "PEACH"  "Imported"  "2011-03-20 11:03:13"
31  "FRUIT"  "MELON"  "Imported"  "2011-04-28 18:42:07"
44  "FRUIT"  "PEACH"  "Imported"  "2011-04-12 11:06:11"
98  "FRUIT"  "CHERRY" "Imported"  "2011-03-19 22:46:04"
211 "FRUIT"  "MELON"  "Imported"  "2011-03-19 22:25:24"
217 "VEG"    "SPINACH""Imported"  "2011-03-19 22:25:24"

我想选择这些:

ID   Type     Name      Value        Date
--  -------   -----    -------       -------------
1   "FRUIT"  "APPLE"  "Imported"  "2011-03-19 22:08:13"
5   "FRUIT"  "LEMON"  "Imported"  "2011-03-19 22:00:44"
31  "FRUIT"  "MELON"  "Imported"  "2011-04-28 18:42:07"
44  "FRUIT"  "PEACH"  "Imported"  "2011-04-12 11:06:11"
98  "FRUIT"  "CHERRY" "Imported"  "2011-03-19 22:46:04"

这是我需要的简化版本,我的表有大约20列,所以我想选择*,如果不是,我可以逐个选择。

所以我想选择* FRUIT类型的行,但只选择那些具有最高日期的行。谢谢

2 个答案:

答案 0 :(得分:30)

这可以给你你想要的东西:

SELECT *
FROM Table
INNER JOIN 
(SELECT Name, MAX(Date) as TopDate
FROM Table
WHERE Type = 'FRUIT'
GROUP BY Name) AS EachItem ON 
    EachItem.TopDate = Table.Date 
    AND EachItem.Name = Table.Name

基本上,它会找到每种水果的最新日期,然后显示每个水果的行信息(加入日期和水果名称)。确保将日期字段和名称字段都编入索引。

如果您可以假设具有最高ID的项目也是具有最高日期的项目(典型但在所有情况下都不一定是真的 - 这取决于您的使用案例),您可以改为MAX(ID) MAX(Date)的{​​{1}},并且只使用该ID进行链接,而不是按日期和名称进行链接。

答案 1 :(得分:6)

如果你使用的是mysql,这将命令SELECT所有类型的“水果”,并将订购从最旧到最新的日期:

 SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC 

如果需要,您可以对其进行限制(这将限制为最早的5):

 SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC LIMIT 5