【问题标题】:SELECT TOP 1 GROUP IN TABLE选择表中的前 1 个组
【发布时间】:2020-02-14 01:28:15
【问题描述】:

在 ORD 表中,

ORD_CODE    PROD_CODE
200212013   66298
200212014   66298
200212006   66297
200212007   66296
200212012   66296
200211025   66295
200211026   66295
200211027   66295
200211028   66295
200211029   66295
200211030   66295
200211031   66295
200211032   66295
200211033   66295
200211034   66295

我想要

200212014   66298
200212006   66297
200212012   66296
200211034   66295

我使用SELECT DISTINCT PROD_CODE, ORD_CODE FROM ORDERT 但它不起作用。

我使用RankNo?但也不工作。

子查询、COUNT()、TOP 1、DESNSE_RANK,一切都不起作用。

【问题讨论】:

    标签: sql sql-server tsql group-by sql-order-by


    【解决方案1】:

    避免显式子查询的一种方法是使用TOP 1 WITH TIES

    SELECT TOP 1 WITH TIES ORD_CODE, PROD_CODE
    FROM yourTable
    ORDER BY ROW_NUMBER() OVER (PARTITION BY PROD_CODE ORDER BY ORD_CODE DESC);
    

    【讨论】:

      【解决方案2】:

      如果你的数据集只有两列,简单的聚合就足够了:

      select min(ord_code) ord_code, prod_code
      from mytable
      group by prod_code
      

      【讨论】:

        【解决方案3】:

        DEMO ON DB<>FIDDLE

        你可以使用ROW_NUMBER()来实现

        ;WITH cte_TempData as (
          SELECT ORD_CODE, PROD_CODE, ROW_NUMBER() OVER (PARTITION BY PROD_CODE ORDER BY ORD_CODE DESC) Row_Number
          FROM #TempTable
        )
        SELECT ORD_CODE, PROD_CODE
        FROM cte_TempData
        WHERE Row_Number = 1
        

        输出

        【讨论】:

          猜你喜欢
          • 2015-12-07
          • 1970-01-01
          • 1970-01-01
          • 2011-07-01
          • 1970-01-01
          • 2015-07-12
          • 1970-01-01
          • 2012-06-16
          • 1970-01-01
          相关资源
          最近更新 更多