按问题分组的SQL

按问题分组的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

我有一个表有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/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;