选择具有最高日期的行

Lon*_*don 20 mysql sql postgresql hibernate

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

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"
Run Code Online (Sandbox Code Playgroud)

我想选择这些:

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"
Run Code Online (Sandbox Code Playgroud)

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

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

IAm*_*rey 34

这应该给你你想要的:

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
Run Code Online (Sandbox Code Playgroud)

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

如果您可以假设具有最高ID的项目也将是具有最高日期的项目(典型但在所有情况下不一定都是真的 - 这取决于您的用例),您可以MAX(ID)代替MAX(Date)并利用仅通过链接该ID而不是按日期和名称链接.


Jas*_*all 11

如果您使用的是mysql,那么将订购SELECT所有类型的"水果",并将订购从最旧到最新的日期:

 SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC 
Run Code Online (Sandbox Code Playgroud)

如果需要,你可以对它进行限制(这将限制为最老的5):

 SELECT * FROM tablename WHERE Type='fruit' ORDER by Date ASC LIMIT 5 
Run Code Online (Sandbox Code Playgroud)

  • 更清洁的解决方案,至少对我而言. (2认同)
  • 顺序应该是 DESC 而不是 ASC (2认同)