Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Вземете първи/последен ред от n-та поредна група

Ще трябва да използвате прозоречната функция ROWNUMBER в подзаявка,...

нещо подобно ще ви отведе до там:

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

Ето актуализацията, базирана на вашата цигулка:

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

Ако idData е инкрементален (и следователно хронологичен), можете да използвате това:

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

Гледайки най-новите ви изисквания, всички може да сме се замислили (ако ви разбирам правилно):

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

Ето цигулка въз основа на това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Анализирайте XML с многостепенно влагане в SQL

  2. Инсталиране на клъстер за отказване на SQL сървър -3

  3. Как да осредните/сумирате данни за един ден в SQL Server 2005

  4. Връщане на списък с имейли, изпратени от SQL Server Database Mail (T-SQL)

  5. Стойност на колоната по подразбиране въз основа на стойността на различна колона