помочь с запросом, который должен возвращать только самую последнюю запись - PullRequest
1 голос
/ 20 мая 2011

Я пытаюсь создать простое представление, которое получает данные из 2 баз данных.

У меня есть таблица booking, которая отображает каждое бронирование только один раз, и таблица дневников с примечаниями по каждому бронированию.

Каждое бронирование отображается в таблице дневников несколько раз, однако мне нужна только самая последняя заметка и информация о бронировании на мой взгляд

По некоторым причинам это не работает

SELECT     
    t0.BOOKNO, t0.PARTY, t0.TOUR, t0.DEPART, t0.DEP7, t0.BOOK7, t0.PAID, t0.APRICE, t1.TEXT
FROM         
    (SELECT DISTINCT 
        TOP (100) PERCENT 
        dbo.DIARY.ADDED, dbo.BOOKINGS.BOOKNO, dbo.BOOKINGS.PARTY, 
        dbo.BOOKINGS.TOUR, dbo.BOOKINGS.DEPART, 
        dbo.BOOKINGS.DEP7, dbo.BOOKINGS.BOOKED, dbo.BOOKINGS.BOOK7, dbo.BOOKINGS.PAID, 
        dbo.BOOKINGS.APRICE, dbo.BOOKINGS.STATUS
     FROM          
        dbo.BOOKINGS 
     CROSS JOIN
        dbo.DIARY
     WHERE      
        (dbo.BOOKINGS.PAID IS NULL) 
        OR (dbo.BOOKINGS.PAID = 0)
     GROUP BY 
        dbo.BOOKINGS.BOOKNO, dbo.BOOKINGS.PARTY, dbo.BOOKINGS.TOUR, dbo.BOOKINGS.DEPART, 
        dbo.BOOKINGS.DEP7, dbo.BOOKINGS.BOOKED, dbo.BOOKINGS.APRICE, dbo.BOOKINGS.STATUS, 
        dbo.BOOKINGS.BOOK7, dbo.BOOKINGS.PAID, dbo.DIARY.ADDED
     HAVING      
        (dbo.BOOKINGS.STATUS <> 'xl') AND 
        (dbo.BOOKINGS.DEPART > CONVERT(int, GETDATE()))
     ORDER BY 
        dbo.BOOKINGS.BOOKNO) AS t0 
INNER JOIN
   (SELECT     
       BOOKNO, TEXT, MAX(ADDED) AS added
    FROM          
       dbo.DIARY AS DIARY_1
    GROUP BY BOOKNO, TEXT) AS t1 ON t0.BOOKNO = t1.BOOKNO

Я пытался это сделать, но не удалось разобрать текст запроса?

;WITH MostRecentBookings AS (  SELECT     dbo.DIARY.ADDED7, dbo.DIARY.ADDED, dbo.BOOKINGS.BOOKNO, dbo.BOOKINGS.PARTY, dbo.BOOKINGS.TOUR, dbo.BOOKINGS.DEPART, 
                      dbo.BOOKINGS.DEP7, dbo.BOOKINGS.BOOKED, dbo.BOOKINGS.BOOK7, dbo.BOOKINGS.PAID, dbo.BOOKINGS.APRICE, dbo.BOOKINGS.STATUS, 
                      dbo.DIARY.TEXT, ROW_NUMBER() OVER(PARTITION BY dbo.BOOKINGS.BOOKNO ORDER BY dbo.DIARY.ADDED DESC) AS 'RowNum'  
FROM         dbo.BOOKINGS INNER JOIN   dbo.DIARY ON dbo.BOOKINGS.BOOKNO = dbo.DIARY.BOOKNO 
WHERE     (dbo.BOOKINGS.PAID IS NULL) OR     (dbo.BOOKINGS.PAID = 0)) 
SELECT    *  FROM    MostRecentBookings 
WHERE    RowNum = 1 

1 Ответ

0 голосов
/ 20 мая 2011

По сути, вы можете использовать CTE (Common Table Expression) в сочетании с функцией ROW_NUMBER() для достижения этой цели.Что-то вроде:

;WITH MostRecentBookings AS
(
   SELECT 
      (some columns),
      ROW_NUMBER() OVER(PARTITION BY b.BOOK_NO ORDER BY d.ADDED DESC) AS 'RowNum'
   FROM
      dbo.Booking b
   INNER JOIN
      dbo.Diary d ON ..........
)
SELECT
   (some columns)
FROM
   MostRecentBookings
WHERE
   RowNum = 1

По сути, CTE выполняет объединение двух таблиц, а затем «разделяет» ваши данные на BOOK_NO - таким образом, каждое уникальное бронирование получает номер строки, которыйначинается с 1.

Нумерация такова, что самая последняя запись получает номер 1, а предыдущая получает последующие более высокие номера.Из этого CTE выберите эти записи с RowNum = 1 для списка самых последних бронирований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...