SQL Group By 仅包含以前未在 table 中的不同条目
SQL Group By only incude distinct entries not previously in table
我正在使用 SQL server 2008。我有一个用户 table 保存用户及其与系统中提案的关系。当一个用户被分配到一个提案时,每个记录的用户都会被添加到系统中。一个用户可以在用户 table 中显示多次。 PK 是 User + Proposal。我有几个专栏,但感兴趣的是 UserId
、Proposal
和 DateCreated
。我正在尝试针对此 table 编写一个查询,以显示每年添加了多少用户。我正在使用 group by DATEPART(year, DateCreated)
但是,当然,这将复制与不同年份的提案关联的用户。这是一些数据:
User Proposal DateCreated
user1 proposal1 1/1/2010
user2 proposal2 1/1/2010
user3 proposal2 1/1/2010
user4 proposal3 1/1/2010
user2 proposal4 1/1/2011
user5 proposal4 1/1/2011
user3 proposal5 1/1/2011
user6 proposal5 1/1/2011
user7 proposal6 1/1/2011
我搜索的结果是
NumUsersAdded YearAdded
4 2010
3 2011
2010 年添加了 user1、2、3、4。2011 年添加了 user5、6、7。从 2011 年的总和中排除 user2 和 user3 是我遇到的问题。
这很简单,你只需要使用NOT EXISTS
:
SELECT DATEPART(YEAR,DateCreated) YearAdded,
COUNT(DISTINCT [User]) NumUsersAdded
FROM dbo.YourTable T
WHERE NOT EXISTS(SELECT 1 FROM dbo.YourTable
WHERE [User] = T.[User]
AND DateCreated < T.DateCreated)
GROUP BY DATEPART(YEAR,DateCreated);
一种方法是 select 每个用户的最小年份,然后计算这些:
SELECT YearCreated, COUNT(*)
FROM (SELECT UserId, DATEPART(year, MIN(DateCreated)) AS YearCreated
FROM users
GROUP BY UserId) t
GROUP BY YearCreated
我正在使用 SQL server 2008。我有一个用户 table 保存用户及其与系统中提案的关系。当一个用户被分配到一个提案时,每个记录的用户都会被添加到系统中。一个用户可以在用户 table 中显示多次。 PK 是 User + Proposal。我有几个专栏,但感兴趣的是 UserId
、Proposal
和 DateCreated
。我正在尝试针对此 table 编写一个查询,以显示每年添加了多少用户。我正在使用 group by DATEPART(year, DateCreated)
但是,当然,这将复制与不同年份的提案关联的用户。这是一些数据:
User Proposal DateCreated
user1 proposal1 1/1/2010
user2 proposal2 1/1/2010
user3 proposal2 1/1/2010
user4 proposal3 1/1/2010
user2 proposal4 1/1/2011
user5 proposal4 1/1/2011
user3 proposal5 1/1/2011
user6 proposal5 1/1/2011
user7 proposal6 1/1/2011
我搜索的结果是
NumUsersAdded YearAdded
4 2010
3 2011
2010 年添加了 user1、2、3、4。2011 年添加了 user5、6、7。从 2011 年的总和中排除 user2 和 user3 是我遇到的问题。
这很简单,你只需要使用NOT EXISTS
:
SELECT DATEPART(YEAR,DateCreated) YearAdded,
COUNT(DISTINCT [User]) NumUsersAdded
FROM dbo.YourTable T
WHERE NOT EXISTS(SELECT 1 FROM dbo.YourTable
WHERE [User] = T.[User]
AND DateCreated < T.DateCreated)
GROUP BY DATEPART(YEAR,DateCreated);
一种方法是 select 每个用户的最小年份,然后计算这些:
SELECT YearCreated, COUNT(*)
FROM (SELECT UserId, DATEPART(year, MIN(DateCreated)) AS YearCreated
FROM users
GROUP BY UserId) t
GROUP BY YearCreated