0

我确定这是一个简单的查询,但它让我难倒了一段时间。我需要加入两个表并只返回每个分组的特定记录。

这是我正在使用的表:

CREATE TABLE [dbo].[FileData](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FinDataID] [int] NULL,
    [PharmacyID] [int] NULL,
    [FileName] [nvarchar](150) NULL,
    [FileExtension] [nvarchar](15) NULL,
    [Data] [varbinary](max) NULL,
    [CreateDate] [datetime] NULL,
    [CreatedByID] [int] NULL,
    [UpdateDate] [datetime] NULL,
    [UpdatedByID] [int] NULL

CREATE TABLE [dbo].[FinData](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [PharmacyID] [int] NULL,
    [PeriodStart] [date] NULL,
    [PeriodEnd] [date] NULL,
    [SalesTotal] [money] NULL,
    [SalesDisp] [money] NULL,
    [SalesRetail] [money] NULL,
    [GPTotal] [decimal](12, 2) NULL,
    [GPRetail] [decimal](12, 2) NULL,
    [GPDisp] [decimal](12, 2) NULL,
    [Advertising] [money] NULL,
    [Rent] [money] NULL,
    [GrossWages] [money] NULL,
    [Depreciation] [money] NULL,
    [InterestExp] [money] NULL,
    [AllOtherExp] [money] NULL,
    [OwnerHours] [money] NULL,
    [CreateDate] [datetime] NULL,
    [CreatedByID] [int] NULL,
    [UpdateDate] [datetime] NULL,
    [UpdatedById] [int] NULL

这些表包含以下示例数据:

FileData:
ID   FinDataID  PharmacyID yadayada
6    13         1
7    13         1
8    13         1
9    13         1
10   15         2
12   13         1
13   13         1

FinData: (where Pharmacy = 1)
ID  PharmacyID  PeriodStart
1   1           2012-07-01
13  1           2011-07-01 

这是我最初使用的示例查询:

SELECT
 FD.ID, FinData.ID AS FinDataID, FD.PharmacyID, FinData.PeriodStart, FinData.PeriodEnd, FileName, FileExtension, ISNULL(DATA,0) AS Data, FD.CreateDate, FD.CreatedByID, FD.UpdateDate, FD.UpdatedById
FROM FinData
LEFT JOIN FileData FD ON FD.FinDataID = FinData.ID
WHERE FinData.PharmacyID = @PharmacyID
ORDER BY PeriodStart desc, ID DESC

它返回了以下数据:

ID   FinDataID   PharmacyID   PeriodStart   yadayadayada
NULL 1           NULL         2012-07-01   
13   13          1            2011-07-01
12   13          1            2011-07-01
9    13          1            2011-07-01
8    13          1            2011-07-01
7    13          1            2011-07-01
6    13          1            2011-07-01

基本上我需要该结果中每个 FinDataID 的最高记录......我知道我很接近但还没有找到解决方案!提前致谢!

4

1 回答 1

1
;WITH Data as
(
  SELECT
     FD.ID, FinData.ID AS FinDataID, FD.PharmacyID, FinData.PeriodStart, FinData.PeriodEnd, FileName, FileExtension, ISNULL(DATA,0) AS Data, FD.CreateDate, FD.CreatedByID, FD.UpdateDate, FD.UpdatedById
   , ROW_NUMBER() OVER (PARTITION BY [FinDataID]
                      ORDER BY [PeriodStart] DESC, [ID] DESC) as [Rank]
  FROM FinData
  LEFT JOIN FileData FD ON FD.FinDataID = FinData.ID
  WHERE FinData.PharmacyID = @PharmacyID
)
SELECT *
FROM [Data]
WHERE [Rank] = 1

请注意,结果集还将包括 [Rank] 列,因此将那个人过滤掉,您就可以开始了。

于 2013-10-17T00:57:16.053 回答