Sql 将select distinct与组和排序相结合 一个简化的例子:考虑一个有3栏的表格“水果”:名称、计数和购买日期。需要一份按字母顺序排列的水果清单,以及上次购买时的数量。排序的顺序和应用的不同程度让我有点困惑。我的尝试- drop table if exists fruit; create table fruit ( name varchar(8), count integer, dateP datetime ); insert into fruit (name, count, dateP) values ('apple', 4, '2014-03-18 16:24:37'), ('orange', 2, '2013-12-11 11:20:16'), ('apple', 7, '2014-07-05 08:34:21'), ('banana', 6, '2014-06-20 19:10:15'), ('orange', 6, '2014-07-22 17:41:12'), ('banana', 4, '2014-08-15 21:26:37'), -- last ('orange', 5, '2014-12-11 11:20:16'), -- last ('apple', 3, '2014-09-25 18:54:32'), -- last ('apple', 5, '2014-02-05 18:47:18'), ('apple', 12, '2013-09-25 14:18:57'), ('banana', 5, '2013-04-18 15:59:04'), ('apple', 9, '2014-01-29 11:47:45'); -- Expecting: -- apple 3 -- banana 4 -- orange 5 select distinct name, count from fruit group by name order by name, dateP; -- Produces: -- apple 9 -- banana 5 -- orange 5

Sql 将select distinct与组和排序相结合 一个简化的例子:考虑一个有3栏的表格“水果”:名称、计数和购买日期。需要一份按字母顺序排列的水果清单,以及上次购买时的数量。排序的顺序和应用的不同程度让我有点困惑。我的尝试- drop table if exists fruit; create table fruit ( name varchar(8), count integer, dateP datetime ); insert into fruit (name, count, dateP) values ('apple', 4, '2014-03-18 16:24:37'), ('orange', 2, '2013-12-11 11:20:16'), ('apple', 7, '2014-07-05 08:34:21'), ('banana', 6, '2014-06-20 19:10:15'), ('orange', 6, '2014-07-22 17:41:12'), ('banana', 4, '2014-08-15 21:26:37'), -- last ('orange', 5, '2014-12-11 11:20:16'), -- last ('apple', 3, '2014-09-25 18:54:32'), -- last ('apple', 5, '2014-02-05 18:47:18'), ('apple', 12, '2013-09-25 14:18:57'), ('banana', 5, '2013-04-18 15:59:04'), ('apple', 9, '2014-01-29 11:47:45'); -- Expecting: -- apple 3 -- banana 4 -- orange 5 select distinct name, count from fruit group by name order by name, dateP; -- Produces: -- apple 9 -- banana 5 -- orange 5,sql,sqlite,Sql,Sqlite,试试这个:- select f1.name,f1.count from fruit f1 inner join (select name,max(dateP) date_P from fruit group by name) f2 on f1.name = f2.name and f1.dateP = f2.date_P order by f1.name 编辑了最后一行:)请尝试以下操作: SELECT fruit.name, fruit.count, fruit.dateP FROM fru

试试这个:-

select f1.name,f1.count
from
fruit f1
inner join
(select name,max(dateP) date_P from fruit group by name) f2
on f1.name = f2.name and f1.dateP = f2.date_P
order by f1.name
编辑了最后一行:)

请尝试以下操作:

SELECT fruit.name, fruit.count, fruit.dateP
FROM fruit
    INNER JOIN (
        SELECT name, Max(dateP) AS lastPurchased
        FROM fruit
        GROUP BY name
    ) AS dt ON (dt.name = fruit.name AND dt.lastPurchased = fruit.dateP )

这里是上这个例子的一个演示。

以前遇到类似情况时,我解决了如下问题,它需要使用主键,在本例中,我添加了
UID

SELECT a.Name,a.Count FROM Fruit a WHERE a.UID IN 
    (SELECT b.UID FROM Fruit b 
    WHERE b.Name = a.Name ORDER BY b.DateP Desc,b.UID DESC LIMIT 1)
这也避免了同样的水果在同一时间被购买两次的可能性;在这个例子中不太可能,但在一个大规模的系统中,它是一种可能会回来困扰你。它也通过按UID排序来处理这个问题,因此它将选择最近添加到表中的购买(假设主键递增)


编辑以删除SQLite 3.7.11或更高版本中的
TOP 1
无效语法

,您可以使用MAX/MIN选择从组中的哪个记录返回其他值(但这要求您在结果中具有该最大值):


如果您想提高性能,请使用通用表表达式,而不是嵌套的Select子句。

SQLite没有
TOP 1
。我的糟糕,从未实际使用过SQLLite,现在编辑为使用“LIMIT”真棒!最后一行,它抱怨“模棱两可的列名:name”-将其改为f1.name,效果非常好。非常感谢。这不是一个答案,这应该是一个评论,或者应该给出一些例子,说明你对老年退休金计划问题的回答是什么意思。
SELECT name, count, MAX(dateP)
FROM fruit
GROUP BY name
ORDER BY name