【问题标题】:Needing TOP group item from SQL query with multiple tables需要来自具有多个表的 SQL 查询的 TOP 组项
【发布时间】:2013-10-17 00:51:00
【问题描述】:

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

这是我正在使用的表格:

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 的最高记录...我知道我很接近但还没有找到解决方案!提前致谢!

【问题讨论】:

  • 你考虑过使用 max() 函数吗?
  • 示例输入数据和预期结果将有助于了解您要查找的内容。我认为错误查询的数据输出没有帮助。
  • 抱歉,回答问题,这是在 SQL Server 2008 上。另外,Mostacho,你说得对,我应该包含示例数据但没有,因为我认为我现有的查询可以用作子查询...我现在将示例数据放入以供后代使用。

标签: sql select join group-by


【解决方案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] 列,因此请过滤掉该人,然后您就可以开始了。

【讨论】:

  • 似乎比必要的复杂。另外,OP 没有指定他的 rdmbs,所以对于它是否支持这种语法存在疑问。
  • 太棒了!从没想过我会感谢 J Lo 除了谢谢!我必须确定 ORDER BY 中的 [ID] 列,但除此之外它很完美!
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 2013-07-31
  • 2021-11-18
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多