T- SQL найти самую последнюю запись клиента без последующих забронированных приложений - PullRequest
1 голос
/ 27 февраля 2020

У меня есть таблица клиентских приложений:

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'

это не проверяет, не было ли последующего appts забронированы .. Я думаю, что мне нужно использовать, если заявление или вложенный .. если кто-то может направить меня, я был бы признателен

ОБНОВЛЕНИЕ: Пример: записи appt для идентификатора клиента: 20 - он должен вернуть дату последней записи 23/20 / 20-- Никаких последующих заявок, забронированных после этой даты, статус не посещен

ID  CID Appt Date   Status
1   20  27/01/20    Not Attended
2   20  30/01/20    Attended
3   20  23/02/20    cancelled

БОЛЬШЕ ПРИМЕРОВ

ID  CID Appt Date   Status
1   30  27/01/20    Not Attended
2   30  30/01/20    Cancelled
3   30  23/02/20    Attended

для Клиента 30 НЕ ДОЛЖНО возвращать какие-либо записи, так как после «Отмененных» заявок мы забронировали им встречу, и статус «Присутствовал»

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Я думаю, вы пытаетесь выяснить, у какого клиента не было встречи с тех пор, как в последний раз он пропустил одно. Обратите внимание, что я предположил, что 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'

SQL FIDDLE

0 голосов
/ 27 февраля 2020

моя задача - найти последнюю встречу, где статус не посещен.

Я думаю, вы хотите:

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
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...