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

Вземете горния 1 ред от всяка група

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
   FROM DocumentStatusLogs
)
SELECT *
FROM cte
WHERE rn = 1

Ако очаквате 2 записа на ден, тогава това ще избере едно произволно. За да получите и двата записа за един ден, използвайте вместо това DENSE_RANK

Що се отнася до нормализирано или не, зависи дали искате:

  • поддържане на статус на 2 места
  • запазване на историята на състоянието
  • ...

Както е в момента, вие запазвате историята на състоянието. Ако искате и най-новото състояние в родителската таблица (което е денормализация), ще ви е необходим тригер за поддържане на "статус" в родителската таблица. или пуснете тази таблица с историята на състоянието.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се покаже дата в немски формат в SQL Server (T-SQL)

  2. Как мога да ИЗБЕРЕМ множество колони в рамките на CASE WHEN на SQL Server?

  3. ADO.NET извикването на T-SQL Stored Procedure причинява SqlTimeoutException

  4. Как да предотвратите актуализации на таблица, с изключение за една ситуация

  5. Android достъп до отдалечена SQL база данни