我有一个如下所示的表结构,我想要做的是检索每个公司代码值最高的前三个记录。
我用谷歌搜索,我找不到更好的方法,所以希望你们能帮助我。
顺便说一句,我正在 MySQL 和 SAP HANA 中尝试这样做。但我希望如果我只能获得 MySQL 的帮助,我可以在查询 HANA 时获取“结构”
非常感谢!
这是表格:
我有一个如下所示的表结构,我想要做的是检索每个公司代码值最高的前三个记录。
我用谷歌搜索,我找不到更好的方法,所以希望你们能帮助我。
顺便说一句,我正在 MySQL 和 SAP HANA 中尝试这样做。但我希望如果我只能获得 MySQL 的帮助,我可以在查询 HANA 时获取“结构”
非常感谢!
这是表格:
在 MySQL 你可以做
无论模拟ROW_NUMBER()
分析功能如何,每组(公司)准确获取三个记录。具有相同值的记录获得相同的排名。
SELECT company, plant, value
FROM
(
SELECT company, plant, value, @n := IF(@g = company, @n + 1, 1) rnum, @g := company
FROM table1 CROSS JOIN (SELECT @n := 0, @g := NULL) i
ORDER BY company, value DESC, plant
) q
WHERE rnum <= 3;
输出:
| 公司 | 工厂 | 价值 | |---------|-------|--------| | 1 | C | 5 | | 1 | 乙| 4 | | 1 | 一个 | 3 | | 2 | 克| 6 | | 2 | C | 5 | | 2 | D | 3 | | 3 | E | 8 | | 3 | 一个 | 7 | | 3 | 乙| 3 |
获取每组的所有记录,其排名从 1 到 3 模拟DENSE_RANK()
分析函数
SELECT company, plant, value
FROM
(
SELECT company, plant, value, @n := IF(@g = company, IF(@v = value, @n, @n + 1), 1) rnum, @g := company, @v := value
FROM table1 CROSS JOIN (SELECT @n := 0, @g := NULL, @v := NULL) i
ORDER BY company, value DESC, plant
) q
WHERE rnum <= 3;
输出:
| 公司 | 工厂 | 价值 | |---------|-------|--------| | 1 | C | 5 | | 1 | 乙| 4 | | 1 | 一个 | 3 | | 1 | E | 3 | | 1 | 克| 3 | | 2 | 克| 6 | | 2 | C | 5 | | 2 | D | 3 | | 3 | E | 8 | | 3 | 一个 | 7 | | 3 | 乙| 3 | | 3 | 克| 3 |
这是SQLFiddle演示
更新:现在看起来 HANA支持分析函数,所以查询看起来像
SELECT company, plant, value
FROM
(
SELECT company, plant, value,
ROW_NUMBER() OVER (PARTITION BY company ORDER BY value DESC) rnum
FROM table1
)
WHERE rnum <= 3;
SELECT company, plant, value
FROM
(
SELECT company, plant, value,
DENSE_RANK() OVER (PARTITION BY company ORDER BY value DESC) rank
FROM table1
)
WHERE rank <= 3;
这是SQLFiddle演示它适用于 Oracle,但我相信它也适用于 HANA