0

我有一个如下所示的表结构,我想要做的是检索每个公司代码值最高的前三个记录。

我用谷歌搜索,我找不到更好的方法,所以希望你们能帮助我。

顺便说一句,我正在 MySQL 和 SAP HANA 中尝试这样做。但我希望如果我只能获得 MySQL 的帮助,我可以在查询 HANA 时获取“结构”

非常感谢!

这是表格:

http://pastebin.com/xgzCgpKL

4

1 回答 1

1

在 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

于 2013-10-02T05:14:17.503 回答