[英]Count Distinct Window Function with Window Frame
I'm trying to write a query to determine the number of unique users in a table over a rolling window of 30 days. 我正在尝试编写一个查询,以确定在30天的滚动窗口中表中唯一身份用户的数量。
I figured I'd write something like this 我想我会写这样的东西
select mydate, count(distinct users)
over (order by mydate rows between 30 preceding and current row);
But this isn't supported in HP Vertica. 但这在HP Vertica中不受支持。 Is there another way I can re-write the window frame naturally, without using window functions? 有没有其他方法可以自然地重写窗口框架,而无需使用窗口功能?
Something like this (you will get the idea - use function) 这样的事情(您会明白的-使用功能)
IF OBJECT_ID('[dbo].[MyUser]') IS NOT NULL
DROP TABLE [dbo].[MyUser]
CREATE TABLE [dbo].[MyUser](
[Id] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
MyDate DATETIME NOT NULL,
Users INT NOT NULL
CONSTRAINT [PK_MyUser] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
)
GO
INSERT INTO [dbo].[MyUser] (MyDate, Users)
SELECT DATEADD(DAY, -1, GETDATE()), 1
UNION ALL
SELECT DATEADD(DAY, -2, GETDATE()), 2
UNION ALL
SELECT DATEADD(DAY, -3, GETDATE()), 3
UNION ALL
SELECT DATEADD(DAY, -4, GETDATE()), 4
UNION ALL
SELECT DATEADD(DAY, -5, GETDATE()), 5
UNION ALL
SELECT DATEADD(DAY, -6, GETDATE()), 6
UNION ALL
SELECT DATEADD(DAY, -7, GETDATE()), 7
UNION ALL
SELECT DATEADD(DAY, -8, GETDATE()), 8
UNION ALL
SELECT DATEADD(DAY, -9, GETDATE()), 9
UNION ALL
SELECT DATEADD(DAY, -10, GETDATE()), 10
GO
IF OBJECT_ID (N'dbo.GetDistinctUsers', N'FN') IS NOT NULL
DROP FUNCTION dbo.GetDistinctUsers;
GO
CREATE FUNCTION GetDistinctUsers (@StartDate DATETIME, @DateWindowSizeInDays INT)
RETURNS INT
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @Users int;
SELECT @Users = COUNT(DISTINCT Users) FROM [dbo].[MyUser] WHERE DATEDIFF(DAY, @StartDate, MyDate) < @DateWindowSizeInDays
RETURN @Users
END;
GO
select MyDate, dbo.GetDistinctUsers(MyDate, 2) FROM [MyUser]
instead DATEDIFF you can use anything you want to get desired results 相反,您可以使用DATEDIFF来获得所需的结果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.