如何比较除一列或两列外具有相同列值的行之间的日期?

How to compare dates between rows with same column values except one or two columns?

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

如何在 SQL 服务器中 select 一行具有单个发票编号的最早过账日期:

现有table:

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

我正在为如何比较两个过帐日期的日期和 return SQL 服务器中每个发票编号的具有最低过帐日期列值的行而苦苦挣扎。

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

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

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

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

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

现有示例table:

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 查询,而且我还检查了特定日期而不是检查数据库,它也失败了。请帮我解决这个问题。

备注:这是示例 table,它将用代码库中的动态列填充动态值,因此,省略美国行是我不期望的输出,根据逻辑获得输出是期望的输出.

谢谢

window 函数是您的朋友。非常值得您花时间与他们相处。也不清楚 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)