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

Jak vyplnit mezery?

Máte 2 problémy, které se snažíte vyřešit. První otázkou je, jak zaplnit mezery. Druhým problémem je vyplnění pole Počet pro tyto chybějící záznamy.

Problém 1:Tento problém lze vyřešit buď pomocí Dates Lookup table nebo vytvořením recursive common table expression . Doporučil bych pro to vytvořit tabulku pro vyhledávání dat, pokud je to možné. Pokud nemůžete vytvořit takovou tabulku, pak budete potřebovat něco takového.

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 by vám mělo vytvořit seznam dat začínající MIN datum ve vaší tabulce a končící na MAX .

Problém 2:Zde je correlated subquery by se hodil (jakkoli se od nich obecně držím dál), abych získal poslední cnt z vašeho původního stolu:

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


  1. Správně používat třídy v jiných třídách v php?

  2. Indexy SQL Server – vzestupné nebo sestupné, jaký je v tom rozdíl?

  3. Mohu použít zástupné znaky v příkazu IN MySQL?

  4. Jak povolit omezení cizího klíče v SQL Server (příklady T-SQL)