Sql 按最新日期每月选择1条不同的记录

Sql 按最新日期每月选择1条不同的记录,sql,sql-server,Sql,Sql Server,我有一个如下所示的数据列表: Name Date Weight Person 1 01/01/2014 89KG Person 2 01/01/2014 62KG Person 1 07/01/2014 88KG Person 2 07/01/2014 62KG Person 1 21/01/2014 85KG Person 2 21/01/2014

我有一个如下所示的数据列表:

 Name        Date           Weight 
Person 1    01/01/2014       89KG
Person 2    01/01/2014       62KG
Person 1    07/01/2014       88KG
Person 2    07/01/2014       62KG
Person 1    21/01/2014       85KG
Person 2    21/01/2014       63KG

我想做的是只选择具有不同名称的记录,这些记录是给定月份的最新日期。因此,对于本例,我只想选择2014年1月21日的人员1和人员2记录(因为这是最新日期)。我使用的是SQL 2008。

请尝试使用
DENSE\u-RANK

select 
  * 
From (
    select 
        *, 
        DENSE_RANK() over(PARTITION BY YEAR([Date]), 
                                     MONTH([Date]) 
                         ORDER BY [Date] desc) Rnk
    From tbl
)x where Rnk=1

请尝试使用
densite\u-RANK

select 
  * 
From (
    select 
        *, 
        DENSE_RANK() over(PARTITION BY YEAR([Date]), 
                                     MONTH([Date]) 
                         ORDER BY [Date] desc) Rnk
    From tbl
)x where Rnk=1

请尝试使用
densite\u-RANK

select 
  * 
From (
    select 
        *, 
        DENSE_RANK() over(PARTITION BY YEAR([Date]), 
                                     MONTH([Date]) 
                         ORDER BY [Date] desc) Rnk
    From tbl
)x where Rnk=1

请尝试使用
densite\u-RANK

select 
  * 
From (
    select 
        *, 
        DENSE_RANK() over(PARTITION BY YEAR([Date]), 
                                     MONTH([Date]) 
                         ORDER BY [Date] desc) Rnk
    From tbl
)x where Rnk=1

请看看这是否适合你

样本数据:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END
脚本:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END
清理脚本:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

请看看这是否适合你

样本数据:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END
脚本:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END
清理脚本:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

请看看这是否适合你

样本数据:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END
脚本:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END
清理脚本:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

请看看这是否适合你

样本数据:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END
脚本:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END
清理脚本:

IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

CREATE TABLE #TEMP(Name VARCHAR(20),
                WDate VARCHAR(20),
                Weight VARCHAR(20))
INSERT INTO #TEMP
VALUES
('Person 1', '01/01/2014', '89KG'),
('Person 2', '01/01/2014', '62KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 1', '07/01/2014', '88KG'),
('Person 2', '07/02/2014', '62KG'),
('Person 1', '21/01/2014', '85KG'),
('Person 2', '21/01/2014', '63KG');
;WITH cte_DateFormat
    AS (
    SELECT Name,
         CONVERT(DATE, WDate, 103) AS WDate,
         Weight
    FROM #TEMP
    )
, cte_Rank
    AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY Name,
                                   CAST(YEAR(WDate) AS VARCHAR(4)) + CAST(MONTH(WDate) AS VARCHAR(2)) ORDER BY WDate DESC) AS ID,
         Name,
         WDate,
         Weight
    FROM cte_DateFormat
    )
    SELECT Name,
         WDate,
         Weight
    FROM cte_Rank
    WHERE ID = 1
IF OBJECT_ID(N'tempdb..#TEMP') > 0
    BEGIN
       DROP TABLE #TEMP
    END

使用行分区,这也会起作用:

SELECT Name, Date, Weight
FROM (  SELECT
            Name, 
            Date, 
            Weight, 
            ROW_NUMBER() OVER ( PARTITION BY Name, MONTH(Date) 
                                ORDER BY Date DESC) AS [RowNum]
        FROM [YourTableHere]
        ) Tbl
WHERE Tbl.RowNum = 1
ORDER BY MONTH(Date), Name
测试脚本:

DECLARE @Table TABLE (Name VARCHAR(20), Date Date, Weight VARCHAR(20))
INSERT INTO @Table (Name, Date, Weight)
VALUES  ('Person 1', '1/1/2014', '89KG'),
        ('Person 2', '1/1/2014', '62KG'),
        ('Person 1', '1/7/2014', '88KG'),
        ('Person 2', '1/7/2014', '62KG'),
        ('Person 1', '1/21/2014', '85KG'),
        ('Person 2', '1/21/2014', '63KG'),
        ('Person 1', '2/1/2014', '84KG'),
        ('Person 2', '2/1/2014', '61KG'),
        ('Person 1', '2/11/2014', '83KG'),
        ('Person 2', '2/11/2014', '60KG')

SELECT Name, Date, Weight
FROM (  SELECT
            Name, 
            Date, 
            Weight, 
            ROW_NUMBER() OVER ( PARTITION BY Name, MONTH(Date) 
                                ORDER BY Date DESC) AS [RowNum]
        FROM @Table
        ) Tbl
WHERE Tbl.RowNum = 1
ORDER BY MONTH(Date), Name

使用行分区,这也会起作用:

SELECT Name, Date, Weight
FROM (  SELECT
            Name, 
            Date, 
            Weight, 
            ROW_NUMBER() OVER ( PARTITION BY Name, MONTH(Date) 
                                ORDER BY Date DESC) AS [RowNum]
        FROM [YourTableHere]
        ) Tbl
WHERE Tbl.RowNum = 1
ORDER BY MONTH(Date), Name
测试脚本:

DECLARE @Table TABLE (Name VARCHAR(20), Date Date, Weight VARCHAR(20))
INSERT INTO @Table (Name, Date, Weight)
VALUES  ('Person 1', '1/1/2014', '89KG'),
        ('Person 2', '1/1/2014', '62KG'),
        ('Person 1', '1/7/2014', '88KG'),
        ('Person 2', '1/7/2014', '62KG'),
        ('Person 1', '1/21/2014', '85KG'),
        ('Person 2', '1/21/2014', '63KG'),
        ('Person 1', '2/1/2014', '84KG'),
        ('Person 2', '2/1/2014', '61KG'),
        ('Person 1', '2/11/2014', '83KG'),
        ('Person 2', '2/11/2014', '60KG')

SELECT Name, Date, Weight
FROM (  SELECT
            Name, 
            Date, 
            Weight, 
            ROW_NUMBER() OVER ( PARTITION BY Name, MONTH(Date) 
                                ORDER BY Date DESC) AS [RowNum]
        FROM @Table
        ) Tbl
WHERE Tbl.RowNum = 1
ORDER BY MONTH(Date), Name

使用行分区,这也会起作用:

SELECT Name, Date, Weight
FROM (  SELECT
            Name, 
            Date, 
            Weight, 
            ROW_NUMBER() OVER ( PARTITION BY Name, MONTH(Date) 
                                ORDER BY Date DESC) AS [RowNum]
        FROM [YourTableHere]
        ) Tbl
WHERE Tbl.RowNum = 1
ORDER BY MONTH(Date), Name
测试脚本:

DECLARE @Table TABLE (Name VARCHAR(20), Date Date, Weight VARCHAR(20))
INSERT INTO @Table (Name, Date, Weight)
VALUES  ('Person 1', '1/1/2014', '89KG'),
        ('Person 2', '1/1/2014', '62KG'),
        ('Person 1', '1/7/2014', '88KG'),
        ('Person 2', '1/7/2014', '62KG'),
        ('Person 1', '1/21/2014', '85KG'),
        ('Person 2', '1/21/2014', '63KG'),
        ('Person 1', '2/1/2014', '84KG'),
        ('Person 2', '2/1/2014', '61KG'),
        ('Person 1', '2/11/2014', '83KG'),
        ('Person 2', '2/11/2014', '60KG')

SELECT Name, Date, Weight
FROM (  SELECT
            Name, 
            Date, 
            Weight, 
            ROW_NUMBER() OVER ( PARTITION BY Name, MONTH(Date) 
                                ORDER BY Date DESC) AS [RowNum]
        FROM @Table
        ) Tbl
WHERE Tbl.RowNum = 1
ORDER BY MONTH(Date), Name

使用行分区,这也会起作用:

SELECT Name, Date, Weight
FROM (  SELECT
            Name, 
            Date, 
            Weight, 
            ROW_NUMBER() OVER ( PARTITION BY Name, MONTH(Date) 
                                ORDER BY Date DESC) AS [RowNum]
        FROM [YourTableHere]
        ) Tbl
WHERE Tbl.RowNum = 1
ORDER BY MONTH(Date), Name
测试脚本:

DECLARE @Table TABLE (Name VARCHAR(20), Date Date, Weight VARCHAR(20))
INSERT INTO @Table (Name, Date, Weight)
VALUES  ('Person 1', '1/1/2014', '89KG'),
        ('Person 2', '1/1/2014', '62KG'),
        ('Person 1', '1/7/2014', '88KG'),
        ('Person 2', '1/7/2014', '62KG'),
        ('Person 1', '1/21/2014', '85KG'),
        ('Person 2', '1/21/2014', '63KG'),
        ('Person 1', '2/1/2014', '84KG'),
        ('Person 2', '2/1/2014', '61KG'),
        ('Person 1', '2/11/2014', '83KG'),
        ('Person 2', '2/11/2014', '60KG')

SELECT Name, Date, Weight
FROM (  SELECT
            Name, 
            Date, 
            Weight, 
            ROW_NUMBER() OVER ( PARTITION BY Name, MONTH(Date) 
                                ORDER BY Date DESC) AS [RowNum]
        FROM @Table
        ) Tbl
WHERE Tbl.RowNum = 1
ORDER BY MONTH(Date), Name


它只返回最新的值。我需要每月返回最新的值。例如,在一年内,我希望返回1月、2月、3月、4月等的最新人均值,因此,如果我的数据集超过1年,则预期输出将为每人12条记录。因此,您需要在稠密_列中添加一个分区,请检查编辑后的答案。!也应该按年份划分吗?谢谢!但是,我们如何编辑此查询以选择每条记录的最新日期?每条记录可能有不同的最新日期。人员1的最晚日期可能是2001年24月,人员2的最晚日期可能是2007年26月。当前查询将只返回排名为1的Person 2的记录。@LiamF.O'Neill为此,您需要在
PARTITION BY
子句中添加
Name
。该子句只返回最新的值。我需要每月返回最新的值。例如,在一年内,我希望返回1月、2月、3月、4月等的最新人均值,因此,如果我的数据集超过1年,则预期输出将为每人12条记录。因此,您需要在稠密_列中添加一个分区,请检查编辑后的答案。!也应该按年份划分吗?谢谢!但是,我们如何编辑此查询以选择每条记录的最新日期?每条记录可能有不同的最新日期。人员1的最晚日期可能是2001年24月,人员2的最晚日期可能是2007年26月。当前查询将只返回排名为1的Person 2的记录。@LiamF.O'Neill为此,您需要在
PARTITION BY
子句中添加
Name
。该子句只返回最新的值。我需要每月返回最新的值。例如,在一年内,我希望返回1月、2月、3月、4月等的最新人均值,因此,如果我的数据集超过1年,则预期输出将为每人12条记录。因此,您需要在稠密_列中添加一个分区,请检查编辑后的答案。!也应该按年份划分吗?谢谢!但是,我们如何编辑此查询以选择每条记录的最新日期?每条记录可能有不同的最新日期。人员1的最晚日期可能是2001年24月,人员2的最晚日期可能是2007年26月。当前查询将只返回排名为1的Person 2的记录。@LiamF.O'Neill为此,您需要在
PARTITION BY
子句中添加
Name
。该子句只返回最新的值。我需要每月返回最新的值。例如,在一年内,我希望返回1月、2月、3月、4月等的最新人均值,因此,如果我的数据集超过1年,则预期输出将为每人12条记录。因此,您需要在稠密_列中添加一个分区,请检查编辑后的答案。!也应该按年份划分吗?谢谢!但是,我们如何编辑此查询以选择每条记录的最新日期?每条记录可能有不同的最新日期。人员1的最晚日期可能是2001年24月,人员2的最晚日期可能是2007年26月。当前查询将只返回Person 2的记录,因为该记录的排名为1。@LiamF.O'Neill为此,您需要在
PARTITION BY
子句中添加
Name