Reputation: 371
I have a query like this:
SELECT TOP 5
CONVERT(varchar(15), CAST(Pout AS time), 100) AS 'OUT',
CONVERT(varchar(15), CAST(pIn AS time), 100) AS 'IN',
DATEDIFF(MINUTE, CONVERT(varchar(5), Pout, 108), CONVERT(varchar(5), pIn, 108)) AS [Total Used]
FROM
loginfo
WHERE
empid = 1001
AND CONVERT(date, pDate) = '28/Nov/2016 2:45:00 PM'
AND pOut IS NOT NULL
ORDER BY
pOut
This query is working fine, but I don't want to show top 5 records, I need to show recent 5 records, I mean last 5 records, but I cannot to ORDER BY pout DESC
, because I want to show report in correct format, but I need to show only last 5 records of my transaction without using descending order
Example if I have records 10 transaction, I want to show only last 5 records in correct format
Upvotes: 2
Views: 172
Reputation: 1912
You may use ROW_NUMBER
but there also you have to use a DESC
with it.
; WITH CTE AS
(
SELECT
CONVERT(varchar(15), CAST(Pout AS time), 100) AS 'OUT',
CONVERT(varchar(15), CAST(pIn AS time), 100) AS 'IN',
DATEDIFF(MINUTE, CONVERT(varchar(5), Pout, 108), CONVERT(varchar(5), pIn, 108)) AS [Total Used],
ROW_NUMBER() OVER(ORDER BY pOut DESC) AS RN
FROM loginfo
WHERE empid = 1001
AND CONVERT(date, pDate) = '28/Nov/2016 2:45:00 PM'
AND pOut IS NOT NULL
) SELECT * FROM CTE
WHERE RN BETWEEN 1 AND 5
ORDER BY OUT
Upvotes: 0
Reputation: 40481
Use ROW_NUMBER()
instead:
SELECT * FROM (
SELECT
CONVERT(varchar(15), CAST(Pout AS time), 100) AS [OUT],
CONVERT(varchar(15), CAST(pIn AS time), 100) AS [IN],
DATEDIFF(MINUTE, CONVERT(varchar(5), Pout, 108),
CONVERT(varchar(5), pIn, 108)) AS [Total Used],
ROW_NUMBER() OVER(ORDER BY pOut DESC) as rnk
FROM loginfo
WHERE empid = 1001
AND CONVERT(date, pDate) = '28/Nov/2016 2:45:00 PM'
AND pOut IS NOT NULL) p
WHERE p.rnk <= 5
ORDER BY What_Ever_You_Want
Or, alternatively , use a derived table :
SELECT * FROM (Your Current Query)
ORDER BY pOut ;
Upvotes: 4