Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengelompokkan total pengguna aktif untuk masing-masing dari 8 minggu sebelumnya

Setup, jadi kami yakin kami membicarakan hal yang sama:

USE tempdb;
GO

CREATE TABLE dbo.users
(
    [user_id] INT IDENTITY(1,1) PRIMARY KEY,
    hired_date DATE NOT NULL, 
    termination_date DATE
);

CREATE TABLE dbo.[date table]
(
    week_start DATE NOT NULL UNIQUE,
    week_end AS CONVERT(DATE, DATEADD(DAY, 6, week_start))
);
GO

SET NOCOUNT ON;
GO

INSERT dbo.[date table](week_start) VALUES
    ('20110806'),
    ('20110813'),
    ('20110820');

INSERT dbo.users(hired_date, termination_date) VALUES
    ('20110101', NULL), -- long-time, active
    ('20110101', '20110807'), -- long-time, fired in week 1
    ('20110807', '20110815'), -- hired week 1, fired week 2
    ('20110816', '20110816'), -- hired week 2, fired week 2
    ('20110807', '20110825'), -- hired week 1, fired week 3
    ('20110806', NULL), -- hired week 1, active
    ('20110807', NULL), -- hired week 1, active
    ('20110813', NULL), -- hired week 2, active
    ('20110821', NULL); -- hired week 3, active
GO

Dengan logika ini, seharusnya ada 6 karyawan aktif selama minggu 1, 7 karyawan aktif selama minggu 2, dan kembali ke 6 lagi di minggu 3. Butuh beberapa menit dan menggambar garis aktif di selembar kertas untuk mencari tahu di mana Saya salah dalam permintaan saya. Sekarang mari kita coba yang ini terhadap data sampel yang telah kita siapkan di tempdb:

;WITH last_8_weeks AS
(
  SELECT TOP (8) week_start, week_end
    FROM dbo.[date table]
    WHERE week_start >= DATEADD(WEEK, -9, CURRENT_TIMESTAMP)
    ORDER BY week_start DESC
)
SELECT d.week_end, COUNT(u.user_id)
  FROM last_8_weeks AS d
  LEFT OUTER JOIN dbo.users AS u
  ON u.hired_date <= d.week_end 
  AND COALESCE(u.termination_date, DATEADD(DAY, 1, d.week_end)) >= d.week_start
  GROUP BY d.week_end
  ORDER BY d.week_end;

Dan kemudian bersihkan:

GO
DROP TABLE dbo.[date table], dbo.users;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VB6 ADODB.Recordset RecordCount properti selalu mengembalikan -1

  2. Bagaimana saya bisa menampilkan struktur tabel dalam kueri SQL Server?

  3. Cara Menambahkan Pemisah ke String Gabungan di SQL Server – CONCAT_WS()

  4. Hapus pernyataan dalam SQL sangat lambat

  5. Menemukan duplikat pada satu kolom menggunakan pilih tempat di SQL Server 2008