如何比较除一列或两列外具有相同列值的行之间的日期?
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)
我对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)