2016-11-30 12 views
5

Tôi có một câu hỏi như thế này:Hiện 5 hồ sơ cuối cùng trong sql mà không sử dụng desc

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 

Truy vấn này đang làm việc tốt, nhưng tôi không muốn hiển thị top 5 hồ sơ, tôi cần phải chứng minh gần đây 5 hồ sơ, tôi có nghĩa là 5 hồ sơ cuối cùng, nhưng tôi không thể để ORDER BY pout DESC, bởi vì tôi muốn hiển thị báo cáo ở định dạng đúng, nhưng tôi chỉ cần hiển thị 5 hồ sơ cuối cùng của giao dịch của tôi mà không sử dụng thứ tự giảm dần

Ví dụ nếu tôi có hồ sơ 10 giao dịch, tôi muốn chỉ hiển thị 5 bản ghi cuối cùng ở định dạng chính xác

+2

Bạn có thể cho chúng tôi biết lý do bạn không muốn 'desc' không? – jarlh

+0

Bạn đang nói, bạn sẽ sử dụng 'Đặt hàng trước' nhưng không phải' desc' (͠◉_◉᷅) – Vikrant

+0

Bây giờ tôi thấy. Làm desc trong một bảng có nguồn gốc, sau đó asc kết quả của nó. – jarlh

Trả lời

5

Sử dụng ROW_NUMBER() thay vì:

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 

Hoặc cách khác, sử dụng một bảng có nguồn gốc:

SELECT * FROM (Your Current Query) 
ORDER BY pOut ; 
+2

sir ,, có vẻ như làm việc .. tôi sẽ kiểm tra lại và xác nhận .. cảm ơn – user3262364

+0

cảm ơn rất nhiều, nó làm việc tốt cho tôi – user3262364

+0

nb: nó sử dụng DESC trong khoản trên –

0

Bạn có thể sử dụng ROW_NUMBER nhưng cũng có bạn phải sử dụng một DESC với nó.

; 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 
+0

Tôi không thấy cách tính năng này hoạt động. Bạn đang sử dụng cột 'ROW_NUMBER()' ở đâu? – sagi

+1

Xin lỗi, tôi vô tình xóa nó trong khi sao chép và dán từ notepad :). Đã cập nhật ngay bây giờ. – Esty

Các vấn đề liên quan