【问题标题】:How to compare dates between rows with same column values except one or two columns?如何比较除一列或两列外具有相同列值的行之间的日期?
【发布时间】:2021-11-30 03:14:08
【问题描述】:

我对 SQL 查询的逻辑有疑问,请帮我解决这个问题。

如何在 SQL Server 中为单个发票编号选择具有最早过帐日期的行:

现有表:

INVOICE NUMBER NAME Posting date Place
2050 Dinosaur 20.05.1998 London
2050 Dinosaur 25.04.1995 Australia
2045 Birds 18.03.1997 America
2045 Birds 27.07.1995 China
2075 Lion 12.06.2012 India

我想这样查询输出:

INVOICE NUMBER NAME Posting date Place
2050 Dinosaur 25.04.1995 Australia
2045 Birds 27.07.1995 China
2075 Lion 12.06.2012 India

我正在努力研究如何比较两个过帐日期的日期并返回 SQL Server 中每个发票编号的过帐日期列值最低的行。

我之前尝试使用MIN()INNER JOIN,但它对我复杂的代码库没有帮助,所以我在这里以简单的方式显示它。

编辑: 从上一个更新我希望此更改只发生在新创建的发票上,而不是已经存在的发票上,所以我想在发票日期时应用大于特定日期或仅当发票编号已存在于数据库中并且同一发票编号有两个过帐日期时才会发生。

如果示例数据库中不存在发票日期并且有两个过帐日期,则查询应该生成一个表,那么它应该显示具有最早过帐日期(具有相同发票号)的单行,例如:china

如果发票日期存在于示例数据库中并且有两个过帐日期,那么它应该显示所有具有相同发票编号且没有变化的行,例如:伦敦,澳大利亚

具有单一发布日期的其他行(无论它们是否存在于示例数据库中)它们应该显示它们的行。例如:印度

现有示例表:

INVOICE NUMBER NAME Invoice Date Posting date Place
2050 Dinosaur 20.03.1999 20.05.1998 London
2050 Dinosaur 20.03.1999 25.04.1995 Australia
2045 Birds 26.06.2005 18.03.1997 America
2045 Birds 26.06.2005 27.07.1995 China
2075 Lion 22.04.2012 12.06.2012 India

我想查询为单个查询以显示如下输出:

INVOICE NUMBER NAME Invoice Date Posting date Place
2050 Dinosaur 20.03.1999 20.05.1998 London
2050 Dinosaur 20.03.1999 25.04.1995 Australia
2045 Birds 26.06.2005 27.07.1995 China
2075 Lion 22.04.2012 12.06.2012 India

我无法将其作为单个 SELECT 查询,而且我还检查了特定日期而不是检查数据库,它也失败了。请帮我解决这个问题。

备注:这是示例表,它将用来自代码库的动态列填充动态值,因此,省略美国行是我不期望的输出,根据逻辑获取输出是预期的输出。

谢谢

【问题讨论】:

  • MySQL SQL Server - 请更正您的标签。
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql logic


【解决方案1】:

窗口函数是你的朋友。非常值得您花时间熟悉它们。也不清楚partition by中是否需要NAME

此外,如果您想查看平局...请使用 dense_rank() 而不是 row_number()

性能更高

Select *
 From  (
         Select *
               ,RN = row_number() over (partition by InvoiceNumber,Name order by PostingDate)
           From YourTable
       ) A
 Where RN=1

另一种选择

Select top 1 with ties *
 From  YourTable 
 Order by row_number() over (partition by InvoiceNumber,Name order by PostingDate)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多