Member 10379103 Ответов: 3

Отображение самой последней даты оформления заказа только один раз при наличии нескольких записей


Вот мои данные:

BookISBN	LastCheckOutDate	PatronNumber
100004	11/14/2011	950101
100005	12/18/2013	950102
100005	1/18/2013	950103
100005	4/10/2013	950104
100005	10/22/2013	950105
100005	9/17/2014	950106
100005	1/11/2016	950107
100005	12/5/2011	950108


Мне нужно, чтобы BookISBN отображался только один раз для самой последней даты последней проверки.

Все эти поля находятся в одной таблице.

Даже когда я запрашиваю MAX (LastCheckOutDate), я все равно получаю несколько записей для BookISBN.

Как я могу получить только одну запись на книгу?;

Мой вопрос таков:
<pre> SELECT  INV.BookISBN,MAX(LastCheckoutDate) AS LastDate,PatronNumber, BookDesc, BookPrice, QtyCheckedOut

 FROM LibraryInventory INV LEFT JOIN Books BKS ON INV.BookISBN = B.BookISBN
 
WHERE B.BookISBN IS NULL
 AND INV.BookISBN IS NOT NULL
 
AND LastCheckoutDate < DATEADD("d", -365, CONVERT(VARCHAR(10),Getdate(),101))
 
GROUP BY INV.BookISBN,PatronNumber, BookDesc, BookPrice, QtyCheckedOut


ORDER BY INV.BookISBN


Что я уже пробовал:

В SQL-узел MSDN, поиск в Google, базовых SQL-запросов максимум()

Peter Leow

Что LastCheckOutDate-это тип varchar?

Member 10379103

Нет-это тип datetime.

3 Ответов

Рейтинг:
2

Graeme_Grant

Вот ключевое слово, которое вам нужно: Функция SQL FIRST() [^]


Member 10379103

Это распознается только в Access-получена ошибка, которая сначала не распознается функцией в SQL server.

Graeme_Grant

Если вы продолжите читать страницу, они покажут вам альтернативу для других систем баз данных. Вот выдержка из этой страницы:

Синтаксис SQL Server -

SELECT TOP 1 column_name FROM table_name
ORDER BY column_name ASC;

Рейтинг:
2

Bryian Tan

Можете ли вы использовать табличное общее выражение CTE?

;WITH temp AS (
SELECT ROW_NUMBER() OVER (PARTITION BY BookISBN
                          ORDER BY LastCheckOutDate DESC
                         ) AS myrownum
       ,*    
from book )
SELECT * FROM temp WHERE myrownum = 1


Выход:
myrownum	BookISBN	LastCheckOutDate	PatronNumber
1	        100004	        2011-11-14	        950101
1	        100005	        2016-01-11	        950107


Теперь вы можете обновить запрос, чтобы присоединиться к таблице LibraryInventory, предполагая, что все записи в LibraryInventory уникальны

Пример:
;WITH temp AS (
SELECT ROW_NUMBER() OVER (PARTITION BY BookISBN
                          ORDER BY LastCheckOutDate DESC
                         ) AS myrownum
       ,*    
from book )
SELECT * FROM temp B JOIN LibraryInventory INV 
ON B.BookISBN = INV.BookISBN
WHERE myrownum = 1


Рейтинг:
2

RAMASWAMY EKAMBARAM

выберите bookisbn, to_date(substr(tempcol, 1, 8), 'yyyymmdd') lastcheckoutdate, substr (tempcol, 9) patronnumber
от
(
выберите bookisbn, max(to_char(lastcheckoutdate, 'yyyymmdd') | / patronnumber) tempcol
от libraryinventory
группа по bookisbn
)
заказ по bookisbn

-- это будет работать в Oracle