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

Как да запълним празнините?

Имате 2 проблема, които се опитвате да разрешите. Първият въпрос е как да запълним празнините. Вторият проблем е попълването на полето Брой за тези липсващи записи.

Проблем 1:Това може да бъде решено чрез използване на Dates Lookup table или чрез създаване на recursive common table expression . Бих препоръчал да създадете таблица за търсене на дати за това, ако това е опция. Ако не можете да създадете такава таблица, тогава ще ви трябва нещо подобно.

WITH CTE AS (
  SELECT MAX(dt) maxdate, MIN(dt) mindate
  FROM yourtable
  ),
RecursiveCTE AS (
  SELECT mindate dtfield
  FROM CTE
  UNION ALL
  SELECT DATEADD(day, 1, dtfield)
  FROM RecursiveCTE R 
    JOIN CTE T
      ON R.dtfield < T.maxdate
  )

Това трябва да ви създаде списък с дати, започващи с MIN дата във вашата таблица и завършваща на MAX .

Проблем 2:Ето къде е correlated subquery би било полезно (доколкото обикновено стоя настрана от тях), за да получите последния cnt от вашата оригинална таблица:

SELECT r.dtfield, 
   (SELECT TOP 1 cnt
    FROM yourtable 
    WHERE dt <= r.dtfield 
    ORDER BY dt DESC) cnt
FROM RecursiveCTE r


  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 2017

  2. Как да определите какво се компилира в SQL Server

  3. Получете заключване на таблица за актуализиране при стартиране на съхранена процедура в SQL Server

  4. SQL Server заявка xml атрибут за стойност на елемент

  5. SQL Server 2008 е инсталиран, въпреки че работещата версия все още е 2005