对于超过 1 的记录计数,检索最小值

For count of records having more than 1 retrieve the least value

我在数据库中有一个 table。我需要从 table 获取记录,如果我的 id 计数大于 1,那么我必须选择具有最小值的记录 (itm_num).

检索到所有唯一 ID。对于 id 的计数大于 1,则检索具有最小值的 itm_num(按升序排序)。

输入:

Source  id    group     cd     itm_num
eu2  10404458 MELDING  DEF      0003
eu2  10404458 MELDING  DEF      0002
eu2  10404458 AANV     PLAN     0001
pda  10020520 AANVRAA  PLAN1    0001
pda  10020520 BGAAD    PLAN1    0007
pda  10020527 HYGGG    PLAN1    0002
sys  10020120 HYGGG    PLAN1    0002
pda  10020620 HYGGG    PLAN1    0002

预期输出:

  Source   id    group     cd     itm_num
    eu2  10404458 AANV     PLAN     0001
    pda  10020520 AANVRAA  PLAN1    0001
    pda  10020527 HYGGG    PLAN1    0002
    sys  10020120 HYGGG    PLAN1    0002
    pda  10020620 HYGGG    PLAN1    0002

我想在 Pyspark 中得到这个结果(SQL 也有帮助) 请帮忙!谢谢

您正在使用保留字作为列名,需要用反引号 (MySQL) 括起来。它可能与其他数据库不同,例如 postgres ("")。但是,如果您使用的是那种命名方式,您可能已经知道了。 不要忘记将 table 名称“test”替换为您的名称。

select * from test where (id, itm_num) in 
(select id, min(itm_num) from test group by id) order by id asc

我会简单地计算行号和 select 第一个。

from pyspark.sql import functions as F, Window

df.withColumn(
    "rwnb",
    F.row_number().over(Window.partitionBy("id").orderBy("itm_num"))
).where("rwnb = 1").drop("rwnb ")

但是如果你不需要整行,一个简单的 min + groupby 就足够了:

df.groupBy("id").agg(F.min("itm_num"))