获取货架上的最后一个项目名称

时间:2016-10-11 15:33:50

标签: sql

我有这张桌子:

CREATE TABLE stock (shelf varchar, item_id INT, item_name varchar);

现在我想得到每个架子上最后一项的清单。最后一项是具有最大item_id的项目。我知道如何只获得最后一个ID:

SELECT shelf, MAX(item_id) FROM stock GROUP BY shelf;

鉴于此数据:

INSERT INTO stock (shelf, item_id, item_name) VALUES (1, 1, 'one');
INSERT INTO stock (shelf, item_id, item_name) VALUES (2, 2, 'two');
INSERT INTO stock (shelf, item_id, item_name) VALUES (1, 3, 'three');
INSERT INTO stock (shelf, item_id, item_name) VALUES (2, 4, 'four');

上面的代码返回:

 2     |   4
 1     |   3

但我如何获得最后一个项目的名称?

(最好有一个标准SQL的解决方案,但如果现在不可能,我正在使用Postgres。)

4 个答案:

答案 0 :(得分:1)

以下是使用Generic的{​​{1}}解决方案适用于我所知道的每个数据库引擎

Correlated sub-query

另一种方法是使用select * from stock s where item_id = (SELECT MAX(item_id) FROM stock s1 where s1.shelf = s.shelf) 效率高于ROW_NUMBER方法,但不适用于所有correlated sub-query例如:RDBMS

答案 1 :(得分:1)

使用SUB查询。这对所有数据库类型都有效(100%)

SELECT s.*
FROM stock s,
     (SELECT shelf, MAX(item_id) AS last_id FROM stock GROUP BY shelf) sub
WHERE s.shelf = sub.shelf
AND s.item_id = sub.last_id

答案 2 :(得分:0)

您可以使用row_number窗口功能:

SELECT shelf, item_id, item_name
FORM   (SELECT shelf, item_id, item_name,
               ROW_NUMBER() OVER (PARTITOIN BY shelf ORDER BY item_id DESC) rn
        FROM   stock)
WHERE  rn = 1

答案 3 :(得分:0)

有多种方法可以获得结果,我已在此sqlfiddle中说明了一些。 @prdp @mureinik建议的方法是一些最好的方法。

var arrayOfObj = [
{a:1, b:1, c:2}, 
{a:1, b:1, c:1}, 
{a:2, b:2, c:2}
];

var result = _.chain(arrayOfObj)
    .groupBy(function (obj) {
        return obj.a.toString() + obj.b.toString();
    })
    .map(function (objects) {

        //replace with code to select the right item based on c
        return _.head(objects);

    }).value();