Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Nhóm tổng số người dùng đang hoạt động cho mỗi 8 tuần trước đó

Thiết lập, vì vậy chúng tôi chắc chắn rằng chúng tôi đang nói về cùng một điều:

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

Với logic này, nên có 6 nhân viên tích cực trong tuần 1, 7 nhân viên tích cực trong tuần 2 và lùi xuống 6 nhân viên trở lại vào tuần 3. Cho tôi vài phút và vẽ các đường hoạt động trên một mảnh giấy để tìm ra đâu Tôi đã sai trong truy vấn của mình. Bây giờ, hãy thử cái này với dữ liệu mẫu mà chúng tôi đã thiết lập trong 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;

Và sau đó dọn dẹp:

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. Tải tệp CSV lên trang SharePoint bằng SSIS

  2. Lỗi SQL:Cú pháp không chính xác gần từ khóa 'Người dùng'

  3. JPA SET IDENTITY_INSERT không hoạt động

  4. Hợp nhất dữ liệu thành hai bảng đích

  5. Các cách khác nhau để chèn dữ liệu vào Bảng SQL Server - Hướng dẫn SQL Server / TSQL Phần 100