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

Jak wypełnić luki?

Masz 2 problemy, które próbujesz rozwiązać. Pierwsza sprawa to jak wypełnić luki. Drugim problemem jest wypełnienie pola Count dla tych brakujących rekordów.

Problem 1:Można to rozwiązać za pomocą Dates Lookup table lub tworząc recursive common table expression . Zalecam utworzenie w tym celu tabeli wyszukiwania dat, jeśli jest to opcja. Jeśli nie możesz stworzyć takiej tabeli, będziesz potrzebować czegoś takiego.

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
  )

To powinno stworzyć listę dat zaczynających się od MIN data w Twojej tabeli i kończąca się na MAX .

Problem 2:Tutaj znajduje się correlated subquery przydałoby się (o ile generalnie trzymam się od nich z daleka), aby pobrać ostatnią cnt z oryginalnego stołu:

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. Co naprawdę robi metoda Statement.setFetchSize(nSize) w sterowniku SQL Server JDBC?

  2. HRESULT:0x8004D00E przy użyciu TransactionScope — C#

  3. Oświadczenie się skończyło. Maksymalna rekurencja 100 została wyczerpana przed zakończeniem instrukcji

  4. Pobierz schemat kolumn tabeli SQL z typem danych i maksymalną długością w wartości liczbowej

  5. C# ASP.Net:Wyjątek (tylko czasami) podczas długiego działania bazy danych