Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

T-SQL - WYBIERZ według najbliższej daty i GROUPED BY ID

możesz tego spróbować.

DECLARE @Date DATE = '10/01/2010';

WITH cte AS
    (
    SELECT ID, LinkedID, ABS(DATEDIFF(DD, @date, DATE)) diff,
        ROW_NUMBER() OVER (PARTITION BY LinkedID ORDER BY ABS(DATEDIFF(DD, @date, DATE))) AS SEQUENCE
    FROM MyTable
    )

SELECT *
FROM cte
WHERE SEQUENCE = 1
ORDER BY ID
;

Nie wskazałeś, jak chcesz postępować w przypadku, gdy wiele wierszy w grupie LinkedID reprezentuje datę najbliższą docelowej. To rozwiązanie będzie zawierać tylko jeden wiersz. W tym przypadku nie można zagwarantować, który wiersz z wielu prawidłowych wartości jest uwzględniony.

Możesz zmienić ROW_NUMBER() na RANK() w zapytaniu, jeśli chcesz uwzględnić wszystkie wiersze reprezentujące najbliższą wartość.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gdzie są rejestrowane próby połączenia z programem SQL Server?

  2. Jak przepisać IS DISTINCT FROM i IS NOT DISTINCT FROM?

  3. Nie można utworzyć wiersza o rozmiarze 8064, który jest większy niż dopuszczalny rozmiar wiersza 8060

  4. Pytanie dotyczące prostej procedury składowanej

  5. Nie można utworzyć indeksu z powodu nieistniejącego duplikatu?