sql >> Databáze >  >> RDS >> Sqlserver

Řádky obsahující skupinové maximum určitého sloupce (jak zabít duplikáty...)

DECLARE @Data TABLE (ID INTEGER, X INTEGER, Y INTEGER)
INSERT @Data VALUES (1,1,1),(2,1,2),(3,1,2),(4,1,3),(5,1,3),
    (6,2,4),(7,2,5),(8,2,5),(9,2,5),(10,3,1),(11,3,10),(12,3,10)

;WITH CTE AS
(
SELECT ID, X, Y, 
    ROW_NUMBER() OVER(PARTITION BY X ORDER BY Y DESC, ID ASC) AS RowNo
FROM @Data
)

SELECT ID, X, Y FROM CTE WHERE RowNo = 1

Takže pomocí ROW_NUMBER() přiřadit každému řádku přírůstkové číslo, které se resetuje na 1 pro každou novou hodnotu X. U řádků se stejnou hodnotou pro X je číslo řádku přiřazeno přírůstkově seřazené podle Y SESTUPNĚ a ID VZESTUPNĚ - takže pro konkrétní hodnotu X bude číslo řádku 1 přiřazeno tomu, který má NEJVYŠŠÍ hodnotu Y a NEJNIŽŠÍ hodnotu ID. Potom přidáme omezení, abychom vrátili pouze ty, kde číslo řádku je 1.



  1. Jak vložím více řádků s cizím klíčem pomocí CTE v Postgres?

  2. Jak najít název omezení v PostgreSQL

  3. AKTUALIZOVAT záznam v jedné databázi s hodnotami z jiné v SQL Server 2008?

  4. Jak zjistit velikost indexů v MySQL