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