【问题标题】:SQL Server stored procedure order when two or more values conflict两个或多个值冲突时的 SQL Server 存储过程顺序
【发布时间】:2016-07-13 12:26:17
【问题描述】:

我正在构建一个 SQL Server 存储过程(在 Sql Azure 上)我能够为需求生成数据,但我无法下订单,我不知道该怎么做。

以下是此刻的查询结果(这是随机数据,有必要的列)

File    | Description   | DateOfFile | OrderOfLoad | BatchID
--------+---------------+------------+-------------+---------    
ABC.DOC | a description | 2016-07-12 |      2      | 10
DEF.PDF | a description | 2016-07-10 |      4      |  6
GHI.DOC | a description | 2016-07-12 |      2      |  3
XYZ.PDF | a description | 2016-07-10 |      1      |  7
WWW.XLS | a description | 2016-05-01 |      5      | 15

首先我必须从最近的第一个 (order by DateOfFile DESC) 开始按日期排序,但如果有两个或多个具有相同日期的文件 (AAAAMMDD),顺序决定如下:最后一个 BatchId 数字和第一个OrderOfLoad 数字(如果两个或多个文件的日期有冲突),因此,对于此处的示例,顺序为

  1. ABC.DOC ...(记录的另一部分)
  2. GHI.DOC ...
  3. XYZ.PDF ...
  4. DEF.PDF ...
  5. WWW.XLS ...

如果你们中的任何人能指导我完成此操作的方法,我将不胜感激,这是一个不影响性能的好方法,我想将其插入临时表,然后进行一些循环(最好不是光标),但是目前我没有任何想法。

谢谢大家。

【问题讨论】:

  • 您的查询是什么样的?您可以在 Order By 中有超过 1 列,例如Order By DateOfFile DESC, OrderOfLoad
  • 另外,如果你有两个同名的文件,你想同时显示还是只显示最新的一个?
  • 嗨@christiandev,订单看起来像塞尔吉奥订单,但在我的情况下,必须出现 BatchId 和 OrderOfLoad 以防万一有两个或多个相同的日期,如果没有日期与订单冲突它只是按日期。
  • 看我的回答,我实际上是按文件和日期分区的,只取最新的。

标签: sql sql-server stored-procedures azure-sql-database


【解决方案1】:

在你的 ORDER BY 子句中试试这个:

ORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoad

【讨论】:

  • 嗨@sergio,我的订单看起来像你的,但在我的情况下,BatchId 和 OrderOfLoad 必须出现以防万一有两个或多个相同的日期,如果没有日期冲突,它只是按日期。
  • @DanyG ORDER BY 将完全按照您的意愿行事。如果特定的 DateOfFile 只有一个值,则没有其他要排序的内容,因此其他子句无关紧要。
  • @Sergio 是的,就这么简单,它运行良好,正如你所建议的那样,我的错误是我的查询中有一些其他的东西(与此无关)使得这个简单的命令不工作,但修复后它工作完美。感谢您的宝贵时间。
【解决方案2】:

正如我之前评论中所说,Order by 中可以有多个列,并且查询会从左到右优先排序...

因此,在您的情况下,如果您将语句更改为 ORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoad,它将按 DateOfFile 排序,然后是 BatchId,最后是 OrderOfLoad

但是,如果在同一天加载两次,这将显示相​​同的文件名。如果要显示当天的最新文件,可以使用Row_Number()...

WITH    cteFiles
          AS (
              SELECT    [File]
                       ,[Description]
                       ,DateOfFile
                       ,OrderOfLoad
                       ,BatchID
                       ,rn = ROW_NUMBER() OVER (PARTITION BY [file], DateOfFile 
                                      ORDER BY DateOfFile DESC, BatchId DESC, OrderOfLoad)
              FROM      tablename
             )
    SELECT  [File]
           ,[Description]
           ,DateOfFile
           ,OrderOfLoad
           ,BatchID
    WHERE   rn = 1

【讨论】:

  • 嗨@christiandev,感谢您的帮助和您的时间,我能够使用 Sergio 查询解决它,但这有助于我找到另一个我需要类似的 SP。
【解决方案3】:

通过查看您的文件日志表,有些东西不见了。

根据Sergio 的建议,查询将为您提供输出。为了使其更健壮,您可以创建一个与BatchDate 相关的唯一batchID,以便您可以查询以更有效地获取我们的输出。

【讨论】:

  • 感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2015-10-06
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多