我有这张桌子:
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。)
答案 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();