Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Nhận hàng đầu tiên / cuối cùng của nhóm thứ n liên tiếp

Bạn sẽ cần sử dụng hàm ROWNUMBER được tạo cửa sổ trong một truy vấn con, ...

một cái gì đó như thế này sẽ đưa bạn đến đó:

ROW_NUMBER() OVER(PARTITION BY Price ORDER BY Claim_Submitted_Date DESC) AS Row 

Đây là bản cập nhật dựa trên fiddle của bạn:

DECLARE @material VARCHAR(20)
SET @material = '1271-4303'


SELECT * FROM
(
SELECT  *,
        ROW_NUMBER() OVER(PARTITION BY Material ORDER BY Claim_Submitted_Date ASC) AS rn  
FROM tabdata t2 
WHERE Material = @material
) res
WHERE rn=2

Nếu idData tăng dần (và do đó theo thứ tự thời gian), bạn có thể sử dụng cái này:

SELECT * FROM
(
SELECT  *,
        ROW_NUMBER() OVER(PARTITION BY Material ORDER BY idData DESC) AS rn  
FROM tabdata t2 
WHERE Material = @material
) res

Nhìn vào các yêu cầu mới nhất của bạn, tất cả chúng ta có thể sẽ suy nghĩ kỹ về nó (nếu tôi hiểu bạn đúng):

DECLARE @MATERIAL AS VARCHAR(9)
SET @MATERIAL = '1271-4303'

SELECT  TOP 1 *
FROM tabdata t2 
WHERE Material = @material
AND PRICE <> (  SELECT TOP 1 Price
                FROM tabdata 
                WHERE Material = @material 
                ORDER BY CLAIM_SUBMITTED_DATE desc)
ORDER BY CLAIM_SUBMITTED_DATE desc

--results
idData  Claim_Submitted_Date        Material    Price
7       2013-11-08 12:16:00.000     1271-4303   18

Đây là fiddle dựa trên điều này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chuyển một byte [] thành datetime trong C #?

  2. Loại bỏ các bản ghi trùng lặp

  3. SQL Server tìm kiếm một cột theo tên

  4. Cách tìm tất cả các tên cột của một từ đồng nghĩa

  5. Mẹo sửa lỗi phân mảnh chỉ mục máy chủ SQL