基于ID的Oracle DB动态返回值[重复]

k5hmc34c  于 2023-02-03  发布在  Oracle
关注(0)|答案(2)|浏览(128)
    • 此问题在此处已有答案**:

Get top results for each group (in Oracle)(5个答案)
First two salaries in each department [duplicate](3个答案)
Limit SQL query to only the top two counts per group [duplicate](1个答案)
How to extract the first 5 rows for each id user in Oracle? [duplicate](2个答案)
Select top 15 records from each group [duplicate](2个答案)
23小时前关门了。
我有一个包含三个字段的表

Material QTY MONTH_YEAR
1 , 1 2020-07
1 , 2 2020-04
1 , 2 2020-03
1 , 2 2020-05
2 , 3 2020-10
2 , 4 ,2020-08
2 , 4 ,2020-08
3 , 4 ,2021-08
3 , 4 ,2021-08
3 , 4 ,2020-08
3 , 4 ,2020-08
3 , 4 ,2019-08

我正在尝试实现的是返回不同物料编号的前两个记录。
产出

Material QTY MONTH_YEAR
1 , 1 2020-07
1 , 2 2020-04
2 , 3 2020-10
2 , 4 ,2020-08
3 , 4 ,2021-08
3 , 4 ,2021-0

先谢了。

polkgigr

polkgigr1#

样本数据:

SQL> select * from test order by material, month_year;

  MATERIAL        QTY MONTH_Y
---------- ---------- -------
         1          2 2020-03
         1          2 2020-04
         1          2 2020-05
         1          1 2020-07
         2          4 2020-08
         2          4 2020-08
         2          3 2020-10
         3          4 2019-08
         3          4 2020-08
         3          4 2020-08
         3          4 2021-08
         3          4 2021-08

12 rows selected.

一般来说,一个选项是按 * something * 对 * 行进行 * 排序 *-在我的示例中,它是按升序对每个material x x x x列进行排序的,因此第1行和第2行具有以下rn值:12-然后获取排名最高的两行。
您所需的输出显示,您实际上需要两行,就像您实际写入的那样,但是-这令人怀疑,因为material = 1不是2020 - 07就是2020 - 05(如果按降序排序),或者2020 - 03和2020 - 04(如果按升序排序)。如果没有其他列可以让我们计算出这样的输出(您指定的那个),那么您就不走运了。
另一方面,如果您想要的输出是错误的,那么修复order by子句(第3行),让查询返回您需要的值(前2行或后2行)。

SQL> with temp as
  2    (select material, qty, month_year,
  3       row_number() over (partition by material order by month_year) rn
  4     from test
  5    )
  6  select material, qty, month_year
  7  from temp
  8  where rn <= 2
  9  order by material, month_year;

  MATERIAL        QTY MONTH_Y
---------- ---------- -------
         1          2 2020-03
         1          2 2020-04
         2          4 2020-08
         2          4 2020-08
         3          4 2019-08
         3          4 2020-08

6 rows selected.

SQL>
wtzytmuj

wtzytmuj2#

您可以使用ROW_NUMBER()(* 通过该函数,您将严格地为每个匹配选择两个,即使出现平局 *)之类的分析函数,如下所示

SELECT Material, qty, month_year
  FROM(
       SELECT ROW_NUMBER() OVER (PARTITION BY Material ORDER BY month_year DESC) AS rn,
              t.*
         FROM t
      ) 
 WHERE rn <= 2

在基于所需输出按month_year列的值降序排序之后。

相关问题