Sql 如何获取一些项目,然后删除重复的项目?
我有一张类似贝娄的桌子。我想获得每天访问用户和角色的次数 表:Sql 如何获取一些项目,然后删除重复的项目?,sql,sql-server,Sql,Sql Server,我有一张类似贝娄的桌子。我想获得每天访问用户和角色的次数 表: CREATE TABLE #TempUser ( [Id] int NULL, [Username] nvarchar(50) NULL ) CREATE TABLE #TempRole ( [Id] int NULL, [Title] nvarchar(50) NULL ) CREATE TABLE #TempUserRole ( [UserId] int NULL, [RoleId] int NULL
CREATE TABLE #TempUser
(
[Id] int NULL,
[Username] nvarchar(50) NULL
)
CREATE TABLE #TempRole
(
[Id] int NULL,
[Title] nvarchar(50) NULL
)
CREATE TABLE #TempUserRole
(
[UserId] int NULL,
[RoleId] int NULL,
[LastDate] date NULL
)
数据:
我如何获得每天的访问次数用户和角色具有相同“用户”、“角色”、“日期”、“计数器日期”的用户列表?我需要输出如下所示:
UserName Role Date CounterOfDay
Charli Admin 2019-02-02 2
Tom Admin 2019-02-02 2
...
这是您的答案,但请检查它可能有任何语法错误,因为我不太经常为SQL Server编写查询
WITH counters AS (
SELECT UserId, RoleId, LastDate, COUNT(*) AS CounterOfDay
FROM TempUserRole
GROUP BY UserId, RoleId, LastDate
)
SELECT
user.UserName
, role.Title
, counters.LastDate
, counters.CounterOfDay
FROM counters
JOIN TempRole AS role ON counters.RoleId = TempRole.Id
JOIN TempUser AS user ON counters.UserId = TempUser.Id
我认为这本书读起来很不错,而且应该比只做连接更有效。您可以尝试以下内容。这是你的电话号码
这看起来像是一个简单的
加入和分组方式。你试过了吗?我不想使用groupby
而且我不能删除重复项。groupby的替代方法是使用COUNT(*)OVER(PARTION BY…)语法。这是哪个数据库系统<代码>按1、2、3分组将不起作用,而且别名未设置。但是,您的方法是好的。BigQuery的标准SQL。谢谢你指出化名,完全没有注意到。将对其进行编辑以包含您的注释
WITH counters AS (
SELECT UserId, RoleId, LastDate, COUNT(*) AS CounterOfDay
FROM TempUserRole
GROUP BY UserId, RoleId, LastDate
)
SELECT
user.UserName
, role.Title
, counters.LastDate
, counters.CounterOfDay
FROM counters
JOIN TempRole AS role ON counters.RoleId = TempRole.Id
JOIN TempUser AS user ON counters.UserId = TempUser.Id
with cte as
(
select
userName,
title,
lastDate,
count(*) as total
from tempUserRole tur
join tempUser tu
on tur.userId = tu.id
join tempRole tr
on tur.roleId = tr.id
group by
userName,
title,
lastDate
),
rnk as
(
select
*,
dense_rank() over (order by lastDate, title, total) as rnk
from cte
),
cnt as
(
select
*,
count(*) over (partition by rnk) as ttl
from rnk
)
select
userName,
title,
lastDate,
total
from cnt
where ttl > 1