如何以某种方式对聚合数据进行分组
How do I group aggregated data a certain way
我有以下样本交易项目收据数据,包括项目、供应商和收据日期:
Item
Vendor
Receipt_Date
A
1
2021-01-01 00:00:00.000
A
2
2021-01-31 00:00:00.000
B
1
2021-02-01 00:00:00.000
B
2
2021-02-10 00:00:00.000
B
3
2021-02-20 00:00:00.000
C
7
2021-03-01 00:00:00.000
我想 select 每个项目的供应商,基于最后的(最大)收货日期,所以上述示例的预期结果是:
Item
Last_Vendor_For_Receipt
A
2
B
3
C
7
我可以对每个项目和供应商的数据进行分组,但我不知道如何通过外部查询实现上述预期结果。我正在使用 SQL Server 2012。这是初始查询:
select
ir.Item
,ir.Vendor
,max(ir.Receipt_Date) Last_Receipt_Date
from
ItemReceipt ir
我在网上和论坛上查过,但很难找到我的具体问题。
谢谢
首先你 select 每个项目所需的最大日期:
select max(Receipt_Date) as max_rcpt_date
, Item
from your_unknown_table
group by Item
然后您可以将其用作子查询来获取供应商:
select Item
, Vendor
from your_unknown_table
where ( Receipt_Date, Item ) in
( select max(Receipt_Date) as max_rcpt_date
, Item
from your_unknown_table
group by Item
)
这将适用于 Oracle。我不确定 SQL-Server 中的 subquery-structure 是否有效。
这是一种使用 TOP
和 ROW_NUMBER
的方法:
SELECT TOP 1 WITH TIES *
FROM yourTable
ORDER BY ROW_NUMBER() OVER (PARTITION BY Item ORDER BY Receipt_Date DESC);
我有以下样本交易项目收据数据,包括项目、供应商和收据日期:
Item | Vendor | Receipt_Date |
---|---|---|
A | 1 | 2021-01-01 00:00:00.000 |
A | 2 | 2021-01-31 00:00:00.000 |
B | 1 | 2021-02-01 00:00:00.000 |
B | 2 | 2021-02-10 00:00:00.000 |
B | 3 | 2021-02-20 00:00:00.000 |
C | 7 | 2021-03-01 00:00:00.000 |
我想 select 每个项目的供应商,基于最后的(最大)收货日期,所以上述示例的预期结果是:
Item | Last_Vendor_For_Receipt |
---|---|
A | 2 |
B | 3 |
C | 7 |
我可以对每个项目和供应商的数据进行分组,但我不知道如何通过外部查询实现上述预期结果。我正在使用 SQL Server 2012。这是初始查询:
select
ir.Item
,ir.Vendor
,max(ir.Receipt_Date) Last_Receipt_Date
from
ItemReceipt ir
我在网上和论坛上查过,但很难找到我的具体问题。
谢谢
首先你 select 每个项目所需的最大日期:
select max(Receipt_Date) as max_rcpt_date
, Item
from your_unknown_table
group by Item
然后您可以将其用作子查询来获取供应商:
select Item
, Vendor
from your_unknown_table
where ( Receipt_Date, Item ) in
( select max(Receipt_Date) as max_rcpt_date
, Item
from your_unknown_table
group by Item
)
这将适用于 Oracle。我不确定 SQL-Server 中的 subquery-structure 是否有效。
这是一种使用 TOP
和 ROW_NUMBER
的方法:
SELECT TOP 1 WITH TIES *
FROM yourTable
ORDER BY ROW_NUMBER() OVER (PARTITION BY Item ORDER BY Receipt_Date DESC);