一个简单的例子:考虑一个表"水果"有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
答案 0 :(得分:1)
试试这个: -
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
最后一行已编辑:)
答案 1 :(得分:0)
尝试以下方法:
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 )
以下是SQLFiddle上此示例的演示。
答案 2 :(得分:0)
当遇到类似情况时我解决了如下问题,它需要使用主键,在这种情况下我添加了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排序来处理这个问题,因此它会选择最近添加到表中的购买(假设递增主键)。
已修改为删除TOP 1
无效语法
答案 3 :(得分:0)
在SQLite 3.7.11或更高版本中,您可以使用MAX / MIN来选择组中哪条记录返回其他值(但这要求您在结果中具有该最大值):
SELECT name, count, MAX(dateP)
FROM fruit
GROUP BY name
ORDER BY name
答案 4 :(得分:0)
如果您想提高性能,请使用Common Table Expressions而不是嵌套的Select子句。