T-SQL查找没有预订后续应用的最新客户记录
我有客户应用表:T-SQL查找没有预订后续应用的最新客户记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有客户应用表: ID PK CID FK ApptDate Status ( it could be; awaiting response, cancelled, did not attend, attended) 客户表: CID PK Name SUrname address etc. 每个客户都有多个预约,我的任务是查找状态为未出席且客户未预订任何后续应用的最后一个预约 我尝试了子查询,但不起作用。还尝试了以下操作: select ID, CID, max(ApptDate) fro
ID PK
CID FK
ApptDate
Status ( it could be; awaiting response, cancelled, did not attend, attended)
客户表:
CID PK
Name
SUrname
address etc.
每个客户都有多个预约,我的任务是查找状态为未出席且客户未预订任何后续应用的最后一个预约
我尝试了子查询,但不起作用。还尝试了以下操作:
select ID, CID, max(ApptDate)
from customer_appts
where status!= 'Attended'
这不是检查是否没有预订任何后续应用。。我想我需要使用if语句或嵌套。。如果有人能指点我,我将不胜感激
更新:
示例:客户ID:20的appt记录-它应返回上一个记录日期23/20/20-在该日期之后没有预订后续appt,并且状态为“未参加”
ID CID Appt Date Status
1 20 27/01/20 Not Attended
2 20 30/01/20 Attended
3 20 23/02/20 cancelled
更多例子
对于客户30,它不应返回任何记录,因为在“取消”应用程序之后,我们为他们预订了一个约会,状态为“已出席”
我的任务是查找状态未出席的最后一次约会
我想你想要:
select a.*
from customer_appts a
where a.id = (select top (1) a2.id
from customer_appts a2
where a2.cid = a.cid and
a2.status <> 'Attended'
order by a2.ApptDate desc
);
我想你是想找出哪位客户自从上次错过约会后就没有预约。注意,我假设id是一个标识列,与订购日期相同 这里有一种方法
SELECT *
FROM customer_appts a
WHERE
status <> 'Attended'
AND NOT EXISTS (
SELECT 1
FROM customer_appts
WHERE cid = a.cid AND id > a.id
)
这是另一个
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY cid ORDER BY id DESC) AS ordering
FROM customer_appts
) a
WHERE
a.ordering = 1
AND status <> 'Attended'
样本数据和预期结果将有所帮助。例如,我假设您希望每个客户都有最后一次约会,而不仅仅是最后一次约会。是的,每个客户您说您希望客户真正有约会?对于状态为“未出席”且没有后续约会的任何客户。但客户20确实有以下预约。您的目标不明确,一个微小的数据样本不足以说明。客户20状态的最后一次约会为“取消”,没有预订其他约会。如果不是很好,我道歉clear@Jane请检查我的答案,我想这就是你想要的。这不是在没有预订后续应用程序的情况下返回上次约会。,。返回最后一个应用日期时,状态为“出席”@Jane。这正是这个问题所要问的:我的任务是找到状态未出席的最后一次约会。如果你有不同的问题,问一个新问题。不,那不是!你参与了这个问题,但是这个问题的标题非常清楚。。如果你帮不上忙,那绝对没关系。。cheers@GordonLinoff快速提问,因为您似乎非常熟悉SQL。如果与排名前1位的位置不相关,那么MAX GROUP BY不是更有效吗?@plalx。不,一般不会。我希望它在索引正确的情况下具有最好的性能。它还保证返回一行。它在第二行工作。。非常感谢你!我将尝试理解您是如何编写查询的。如果您能给我发送有用的链接阅读,我将不胜感激。干杯,第一个也应该有效,除非我错过了一个边缘案例。你能给我举一个它不起作用的例子吗?对于第二个查询,按cid ORDER BY id DESC进行的ROW_NUMBER OVERPARTITION将为您提供按每位客户降序排列的预约订单。一旦您有了该信息,您只需检查给定客户a.ordering=1的最后一次约会是否未出席状态为“已出席”。第一次查询也会执行相同的操作。它会根据每个客户MAXid…GROUP BY cid查找最后一个无人参与的约会,并确保后面没有任何其他约会条目。更新了第一个约会条目,我们实际上不必检查最大值,因为它是最大值,如果之后没有任何事件。。。
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY cid ORDER BY id DESC) AS ordering
FROM customer_appts
) a
WHERE
a.ordering = 1
AND status <> 'Attended'