【问题标题】:For count of records having more than 1 retrieve the least value对于超过 1 的记录计数,检索最小值
【发布时间】:2021-12-06 08:00:42
【问题描述】:

我在数据库中有一个表。我需要从表中获取记录,如果我的 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 也会有所帮助) 请帮忙!谢谢。

【问题讨论】:

    标签: sql dataframe pyspark count duplicates


    【解决方案1】:

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

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

    【讨论】:

    • 这个查询对我不起作用
    • 我忘记将其他列包含在 group by 子句中。我已经编辑了我的解决方案。如果还有问题请告诉我。
    • 我不确定您的解决方案是否有效。你应该尝试一个真实的例子。如果将 group 放在 groupby 子句中,则不再进行重复数据删除
    • 是的,你是对的,谢谢。我又修改了一遍。
    【解决方案2】:

    我会简单地计算一个行号并选择第一个。

    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"))
    

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      相关资源
      最近更新 更多