gpt4 book ai didi

sql - 如何在加入时仅返回最新记录

转载 作者:行者123 更新时间:2023-12-01 03:39:53 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Fetch the row which has the Max value for a column

(35 个回答)


6年前关闭。




我正在加入 table 。我只想根据日期字段从连接表中返回一条记录。

这是我迄今为止所做的简化 fiddle :http://sqlfiddle.com/#!3/be0cdd/2

我的表:

  CUSTOMER

| CustomerID |
--------------
| 1 |


PURCHASE

| PurchaseID | CustomerID | ProductID | CreateDate | ArchiveFlag |
------------------------------------------------------------------
| 1 | 1 | 443 | 01-FEB-15 | F |
| 2 | 1 | 551 | 01-MAR-15 | F |
| 3 | 1 | 151 | 01-JAN-15 | F |
| 4 | 1 | 654 | 01-MAY-15 | T |
| 5 | 1 | 345 | 01-APR-15 | T |

这是查询本身:
select *
from customer c
join purchase p
on c.customerid = p.customerid
and p.archiveflag = 'F';

我只想为每个客户返回未存档的最新购买(在本例中为购买 ID 2)。

理想输出:
| CustomerID | PurchaseID | CustomerID_2 | ProductID | CreateDate | ArchiveFlag |
|--------------------------------------------------------------------------------
| 1 | 2 | 1 | 551 | 01-MAR-15 | F |

最佳答案

Oracle 12c 引入了一个行限制子句,你可以这样做(如果你只想要一个结果):

SELECT *
FROM customer c
INNER JOIN purchase p
ON ( c.customerid = p.customerid )
WHERE p.archiveflag = 'F'
ORDER BY
CreateDate DESC
FETCH FIRST 1 ROW ONLY

在早期版本中,您可以执行以下操作:

SQL Fiddle

Oracle 11g R2 架构设置 :
create table CUSTOMER(CustomerID INT);
create table PURCHASE(PurchaseID INT, CustomerID INT, ProductID INT, CreateDate date, ArchiveFlag char);

insert into CUSTOMER values(1);
insert into CUSTOMER values(2);

insert into PURCHASE values(1,1,443,'01-FEB-15','F');
insert into PURCHASE values(2,1,551,'01-MAR-15','F');
insert into PURCHASE values(3,1,151,'01-JAN-15','F');
insert into PURCHASE values(4,1,654,'01-MAY-15','T');
insert into PURCHASE values(5,1,345,'01-APR-15','T');
insert into PURCHASE values(6,2,234,'01-MAY-15','T');
insert into PURCHASE values(7,2,134,'01-APR-15','F');
insert into PURCHASE values(8,2,999,'01-JAN-15','F');
insert into PURCHASE values(9,2,724,'07-JUN-15','F');
insert into PURCHASE values(10,2,345,'01-JUN-15','T');

查询 1 - 如果您只想获取单个客户的最新信息 :
SELECT *
FROM (
SELECT *
FROM Purchase
WHERE archiveflag = 'F'
AND CustomerID = 1
ORDER BY
CreateDate DESC
)
WHERE ROWNUM = 1

Results :
| PURCHASEID | CUSTOMERID | PRODUCTID |              CREATEDATE | ARCHIVEFLAG |
|------------|------------|-----------|-------------------------|-------------|
| 2 | 1 | 551 | March, 01 2015 00:00:00 | F |

查询 2 - 如果您想获取所有客户的最新信息 :
SELECT PurchaseID,
CustomerID,
ProductID,
CreateDate,
ArchiveFlag
FROM (
SELECT p.*,
ROW_NUMBER() OVER ( PARTITION BY p.CustomerID ORDER BY CreateDate DESC ) RN
FROM purchase p
WHERE ArchiveFlag = 'F'
)
WHERE RN = 1

Results :
| PURCHASEID | CUSTOMERID | PRODUCTID |              CREATEDATE | ARCHIVEFLAG |
|------------|------------|-----------|-------------------------|-------------|
| 2 | 1 | 551 | March, 01 2015 00:00:00 | F |
| 9 | 2 | 724 | June, 07 2015 00:00:00 | F |

PURCHASE.CUSTOMERID是链接到 CUSTOMER.CUSTOMERID 的非空外键那么你不需要加入表(如上)。

关于sql - 如何在加入时仅返回最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31609961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com