将select distinct与group和ordering结合起来

时间:2014-03-18 20:29:32

标签: sql sqlite

一个简单的例子:考虑一个表"水果"有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

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子句。