sql - SQL 查找客户 X 预订
问题描述
有一个名为 cust (as c) 的表,它是从最旧到最新的所有预订列表,包含以下列:
clientid, bookref, tourno, book_date
我正在尝试使用此预制 SQL 查找第一次、第二次、第三次、第四次和第五次预订的客户:
select c.clientid as ClientID, c.bookref as BookRef, left(c.tourno,6) as TourRef, t.place as Product, c.book_date as BookDate, c.paxnumb as Pax, c.tourcost as Revenue,
iif(c.book_date = fb.fbdate,'Y','N') as FirstBook, s.name as Source
from (select clientid, bookref, tourno, book_date, paxnumb, tourcost, sourceid from cust) as c
inner join (select tourno, place from tourlist) as t on c.tourno = t.tourno
inner join (select id, name from source) as s on c.sourceid = s.id
inner join (select clientid, min(created_date) as fbdate from custhist group by clientid) as fb on c.clientid = fb.clientid
where c.book_date between '2017-01-01' and '2019-09-30'
group by ClientID, BookRef, TourRef, Product, BookDate, Pax, Revenue, FirstBook, Source
Having FirstBook = 'Y'
order by BookRef asc
如果 bookref 是该 clientid 的第一个预订,这将返回一个带有“Y”或“N”标志的表。所以这是我的起点,我最终得到了一份 42,000 名客户的名单,这些客户在 2017 年 1 月 1 日至 2019 年 9 月 30 日期间进行了首次预订。
在这 42,000 名客户中,我如何找出他们的第 2、第 3、第 4 和第 5 次预订(如果存在)?
谢谢!
解决方案
您需要 row_number() 按组中的 orderdate 进行分区,根据 clientid,每组最多 5 条记录的 desc 顺序
select c.clientid as ClientID, c.bookref as BookRef, left(c.tourno,6) as TourRef, t.place as Product, c.book_date as BookDate, c.paxnumb as Pax, c.tourcost as Revenue,
ROW_NUMBER() over (partition by c.book_date order by c.book_date desc) rn,
iif(c.book_date = fb.fbdate,'Y','N') as FirstBook, s.name as Source
from (select clientid, bookref, tourno, book_date, paxnumb, tourcost, sourceid from cust) as c
inner join (select tourno, place from tourlist) as t on c.tourno = t.tourno
inner join (select id, name from source) as s on c.sourceid = s.id
inner join (select clientid, min(created_date) as fbdate from custhist group by clientid) as fb on c.clientid = fb.clientid
where c.book_date between '2017-01-01' and '2019-09-30'
group by ClientID, BookRef, TourRef, Product, BookDate, Pax, Revenue, FirstBook, Source
Having rn<=5
order by BookRef asc
推荐阅读
- java - 如何在 Websphere 8.5.5 上的 SOAP 响应中发送 CDATA 部分
- linux - Ubuntu Docker 容器立即停止,Dockerfile 有问题吗?
- reactjs - 如何在 typescript react 的 bpmn-js/lib/Modeler 中获取 XML?
- angular - 树组件未正确呈现
- c# - 为什么 .net modulo 与 Windows calcuator 对小数的工作方式不同?
- node.js - 具有express框架的nodejs中的acl权限
- oauth-2.0 - 如何在 GSuite 中创建 OAuth 2.0 应用程序仅供内部使用?
- swift - 在 Swift 4 中将可选字符串转换为 Int
- elixir - 如何有一个键值输出
- zabbix - Zabbix API - 有没有办法在特定时间范围内请求减少“趋势”或“历史”记录的数量