按问题分组的SQL
我有一个表有3列,即点、项目id和创建日期。例如,每次分配点时,都会生成一条新记录按问题分组的SQL,sql,database,sql-server-2008,group-by,aggregate-functions,Sql,Database,Sql Server 2008,Group By,Aggregate Functions,我有一个表有3列,即点、项目id和创建日期。例如,每次分配点时,都会生成一条新记录 points = 20 project_id = 441 creation_date = 04/02/2011 -> Is one record points = 10 project_id = 600 creation_date = 04/02/2011 -> Is another record points = 5 project_id = 441 creation_dae = 06/02/201
points = 20 project_id = 441 creation_date = 04/02/2011 -> Is one record
points = 10 project_id = 600 creation_date = 04/02/2011 -> Is another record
points = 5 project_id = 441 creation_dae = 06/02/2011 -> Is final record
(创建日期是输入记录的日期,通过将默认值设置为GETDATE()来实现)
现在的问题是,我想获得按项目id分组的最大点数,但我也希望创建日期与它一起出现,以便我可以将其用于其他目的,如果创建日期重复它的ok,我不能按创建日期分组,因为如果我这样做,它将跳过id为600的项目的点,它是错误的,因为id为600是另一个项目,它的最大点是10,所以应该列出,并且只有当我使用项目id进行分组时才可能列出,但是我还应该如何列出创建日期
到目前为止,我使用这个查询来获得每个项目的最大分数
选择最大(点)作为点,项目id从LogiCpsLogs作为LCL
其中(writer_id=@writer_id)和(DATENAME(mm,GETDATE())=DATENAME(mm,创建日期))和(点0)
按项目分组\u id
writer_id是我想要查看其点的writer的id,比如writer_id=1、2或3 这个查询只显示当月的结果,但我想列出创建日期。请帮助。子查询方式
SELECT P.Project_ID, P.Creation_Date, T.Max_Points
FROM Projects P INNER JOIN
(
SELECT Project_ID, MAX(Points) AS Max_Points
FROM Projects
GROUP BY Project_ID
) T
ON P.Project_ID = T.Project_ID
AND P.Points = T.Max_Points
请参阅评论:这将为您提供获得最高分数的所有天数。如果您只需要一个,查询将更加复杂
编辑:
- 误读需求。增加了额外的限制
- 我会给你样品
SELECT MAX(POINTS),
PROJECT_ID,
CREATION_DATE
FROM yourtable
GROUP by CREATION_DATE,PROJECT_ID;
这应该是您想要的,您甚至不需要分组或加重功能:
SELECT points, project_id, created_date
FROM @T AS LCL
WHERE writer_id = @writer_id AND points <> 0
AND NOT EXISTS (
SELECT TOP 1 1
FROM @T AS T2
WHERE T2.writer_id = @writer_id
AND T2.project_id = LCL.project_id
AND T2.points > LCL.points)
我的结果:
Result Set (3 items)
points | project_id | created_date
20 | 441 | 04/02/2011 00:00:00
10 | 600 | 04/02/2011 00:00:00
15 | 241 | 21/09/2011 18:59:31
我的解决方案使用交叉应用子查询 为了获得最佳性能,我在项目id(
ASC
)和点(DESC
排序顺序)字段上创建了一个索引
如果您想查看所有具有最大点数的创建日期
值,则可以使用带领带的:
CREATE TABLE dbo.Project
(
project_id INT PRIMARY KEY
,name NVARCHAR(100) NOT NULL
);
CREATE TABLE dbo.ProjectActivity
(
project_activity INT IDENTITY(1,1) PRIMARY KEY
,project_id INT NOT NULL REFERENCES dbo.Project(project_id)
,points INT NOT NULL
,creation_date DATE NOT NULL
);
CREATE INDEX IX_ProjectActivity_project_id_points_creation_date
ON dbo.ProjectActivity(project_id ASC, points DESC)
INCLUDE (creation_date);
GO
INSERT dbo.Project
VALUES (1, 'A'), (2, 'BB'), (3, 'CCC');
INSERT dbo.ProjectActivity (project_id, points, creation_date)
VALUES (1,100,'2011-01-01'), (1,110,'2011-02-02'), (1, 111, '2011-03-03'), (1, 111, '2011-04-04')
,(2, 20, '2011-02-02'), (2, 22, '2011-03-03')
,(3, 2, '2011-03-03');
SELECT p.*, ca.*
FROM dbo.Project p
CROSS APPLY
(
SELECT TOP(1) WITH TIES
pa.points, pa.creation_date
FROM dbo.ProjectActivity pa
WHERE pa.project_id = p.project_id
ORDER BY pa.points DESC
) ca;
DROP TABLE dbo.ProjectActivity;
DROP TABLE dbo.Project;
您还需要在积分上加入。。。否则,您将获得比问题要求更多的记录。。(只需要每个项目的项目创建日期和最大点数)。你还需要注意在不同的日子里获得相同(最大)分数的情况。。。必须做出决定,以确定您是否想要所有达到该分数值的创建日期,或者如果您只想要第一个或最后一个日期(例如,我误读了要求)。我认为创建日期是项目创建的日期,而不是记录的日期。哈哈!谢谢你的校对。
CREATE TABLE dbo.Project
(
project_id INT PRIMARY KEY
,name NVARCHAR(100) NOT NULL
);
CREATE TABLE dbo.ProjectActivity
(
project_activity INT IDENTITY(1,1) PRIMARY KEY
,project_id INT NOT NULL REFERENCES dbo.Project(project_id)
,points INT NOT NULL
,creation_date DATE NOT NULL
);
CREATE INDEX IX_ProjectActivity_project_id_points_creation_date
ON dbo.ProjectActivity(project_id ASC, points DESC)
INCLUDE (creation_date);
GO
INSERT dbo.Project
VALUES (1, 'A'), (2, 'BB'), (3, 'CCC');
INSERT dbo.ProjectActivity (project_id, points, creation_date)
VALUES (1,100,'2011-01-01'), (1,110,'2011-02-02'), (1, 111, '2011-03-03'), (1, 111, '2011-04-04')
,(2, 20, '2011-02-02'), (2, 22, '2011-03-03')
,(3, 2, '2011-03-03');
SELECT p.*, ca.*
FROM dbo.Project p
CROSS APPLY
(
SELECT TOP(1) WITH TIES
pa.points, pa.creation_date
FROM dbo.ProjectActivity pa
WHERE pa.project_id = p.project_id
ORDER BY pa.points DESC
) ca;
DROP TABLE dbo.ProjectActivity;
DROP TABLE dbo.Project;