【问题标题】:SQL Server Adding Order with CTESQL Server 使用 CTE 添加订单
【发布时间】:2017-05-02 14:41:26
【问题描述】:

我想在 while 循环中实现一些简单的事情,但是运行起来太慢了,所以我确信我可以使用 CTE 表来做到这一点,但我不知道如何......

我有两个表,其中包含一对多连接,我正在尝试在我的详细信息中下订单,这是我的数据:

对于每个 IDRV,您都有许多 IDRVOBJET。我想为 IDRV 中的每个 IDRVOBJET 放置一个订单号 1 到 n。我不知道我是否清楚,但这就是我应该得到的结果:

感谢您抽出宝贵时间帮助我!

编辑

这是格式化的文本:

IDRV  IDRVOBJET ORDER
12700   76357   1
12700   76358   2
12701   76363   1
12701   76364   2
12701   76365   3
12702   76359   1
12702   76360   2
12703   76120   1
12703   76121   2
12703   76122   3
12705   19375   1
12705   19376   2
12706   19410   1
12707   19408   1
12707   19409   2
12709   22473   1
12709   22474   2
12711   40352   1
12711   40353   1

【问题讨论】:

  • @jarlh 我明白这只是为了更清楚。我只是将格式化的文本放在我的编辑中

标签: sql sql-server join common-table-expression


【解决方案1】:

只需使用窗口函数。

SELECT
   IDRV,
   IDRVOBJECT,
   ROW_NUMBER() OVER (PARTITION BY IDRV ORDER BY IDRVOBJECT) as ORDRE
FROM YourTable

【讨论】:

  • 有效!! ...我的天哪,我感到羞耻-_- 大约 1 小时。如果你能解释一下它是如何工作的,我下次会帮助我:) 谢谢
  • ROW_NUMBER 您可以阅读here,但关键是分区和排序依据。在 ROW_NUMBER() 之类的窗口函数中,Order by 是必需的,而 PARTITION BY 是可选的。 PARTITION 本质上是对结果集进行分组或分区,因此如果没有它,您的整个结果集将在不考虑 IDRV 是什么的情况下进行排序。把它拿出来看看有什么不同:)。也可以在 ORDER BY 之后尝试 ASC 和 DESC。
  • 非常感谢各位!我确实尝试了 row_number 但我不知道它的分区部分:)
【解决方案2】:

你可以使用row_number和partition by

 select *, Ordr = Row_Number() over (partition by IDRV order by IDRVOBJET) from your table

【讨论】:

    【解决方案3】:
    SELECT IDRV,IDRVOBJECT,Row_Number()Over(Partition by IDRV Order by IDRVOBJECT) AS ORDRE
    FROM <yourtable> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 2019-08-28
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 2017-05-07
      • 1970-01-01
      相关资源
      最近更新 更多