【问题标题】:Two different methods of obtaining max row获取最大行数的两种不同方法
【发布时间】:2017-03-01 11:57:32
【问题描述】:

第一个陈述是我需要如何根据我工作的组织的需求来拉出最小行。起初,我会MIN(DATEFIELD),但如果有人在同一天有两个条目,我们就会遇到问题。接下来我尝试了MIN(OP__DOCID),其中 OP__DOCID 是表的唯一键。这里的问题是,如果有人回溯他们忘记创建的条目,结果将不准确。所以,我想出了下面的说法。它可以确保我获得每次唯一录取的最新结果。

SELECT OP__DocID
FROM FD__CNSLG_BASIS24 AS PC1
WHERE (OP__DOCID = 
        (SELECT TOP(1)OP__DocID
            FROM FD__CNSLG_BASIS24 AS PC2
            WHERE PC2.ClientKey = PC1.Clientkey and PC2.ProgramAdmitKey = PC1.Programadmitkey
            ORDER BY Date_Screening
        )
    )

最近,我了解了OVER(PARTITION BY),并且很好奇它的工作原理与它的细微差别。上面的语句,因为我确实得到了不同的结果。

SELECT OP__DocID = Min(OP__DOCID) OVER (Partition BY Clientkey, Programadmitkey)
FROM FD__CNSLG_BASIS24

任何见解或我可以阅读的其他页面的链接都会非常有帮助。

谢谢!

【问题讨论】:

  • 您能否提供数据的结构、一些示例数据以及您发现这两个查询之间的差异是什么?此外,如果您能说出想要的结果是什么,那将很有用。
  • 另外,您可以使用您正在使用的 rdbms(sqlserver、mysql、...)标记问题
  • 抱歉信息丢失。戈登在下面发布的内容符合我的要求。期望的结果是检索第一条记录。我也在尝试检索最近的记录(这就是为什么我在上面输入了 MAX 而不是 MIN)。不同之处在于某些记录将出现在第一个脚本中,而不是第二个脚本中,反之亦然。它只是一只手,所以我认为它可能是那张唱片独有的东西......这意味着必须查看它们中的每一个:/

标签: sql sql-server min window-functions


【解决方案1】:

只使用窗口函数:

select pc.*
from (select pc.*,
             row_number() over (partition by Clientkey, ProgramAdmitKey
                                order by Date_Screening  -- do you mean DESC?
                               ) as seqnum
      from FD__CNSLG_BASIS24 PC
     ) pc
where seqnum = 1;

注意:这会根据放映日期获取第一条记录。您可能希望 DESC 获取最新信息。

【讨论】:

  • 哦!您可以在 OVER() 函数中使用order by。 row_Number 是 order by 工作的唯一方式吗?我尝试将它与 MIN(OP__DOCID) 一起使用,但它给出了错误。
  • 另外,我在原来的脚本中犯了一个错误,说 MAX 我是想把 MIN 放进去。
  • @J_Lyne 当您说 Min(op_docid) 时,它将返回字段 op_docid 的最小值,因此另一个字段的顺序是多余的并且不被接受。您可能想尝试使用 LAST_VALUE/FIRST_VALUE 而不是 MIN/MAX
【解决方案2】:

我的解决方案,适合那些好奇的人

我想返回并用 SELECT TOP(1) 替换 ROW_Number() 函数,但我需要得到一份报告,这提供了我需要的东西。感谢大家的帮助。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
BEGIN
    SET NOCOUNT ON;

Declare 
@StartDate Date,
@EndDate Date

SET @StartDate = '1/1/2016'
SET @EndDate = '6/1/2016'

WITH CNSL_Clients AS (
                SELECT PC_CNT.Clientkey, PC_Cnt.ProgramAdmitKey, PC_Cnt.OP__DOCID
                FROM FD__Primary_Client as PC_Cnt
                                INNER JOIN VW__Cnsl_Session_Count_IndvFamOnly as cnt
                                    ON PC_Cnt.Clientkey = CNT.Clientkey AND PC_Cnt.ProgramAdmitKey = CNT.ProgramAdmitKey
                WHERE ((pc_CNT.StartDate between @StartDate AND @EndDate) OR (pc_CNT.StartDate <= @StartDate AND pc_CNT.ENDDate >= @StartDate) OR (pc_CNT.StartDate <= @StartDate AND pc_CNT.ENDDate is null)) 
                AND CNT.SessionCount>=6
),

FIRST_BASIS AS (
            SELECT CB24_1.OP__DOCID, CB24_1.Date_Screening, CB24_1.ClientKey, CB24_1.ProgramAdmitKey, CB24_1.Composite_score, CB24_1.Depression_Results,CB24_1.Emotional_Results, CB24_1.Relationships_Results
            FROM FD__CNSLG_BASIS24 AS CB24_1
            WHERE (CB24_1.OP__DOCID =
                    (Select TOP(1) CB24_2.OP__DOCID
                    FROM FD__CNSLG_BASIS24 AS CB24_2
                                        Inner JOIN CNSL_Clients
                                            ON CB24_2.ClientKey = CNSL_Clients.ClientKey AND CB24_2.ProgramAdmitKey = CNSL_Clients.ProgramAdmitKey
                    WHERE (CB24_1.ClientKey = CB24_2.ClientKey) AND (CB24_1.ProgramAdmitKey = CB24_2.ProgramAdmitKey)
                    ORDER BY CB24_2.Date_Screening))
),

RECENT_BASIS AS (
            SELECT CB24_1.OP__DOCID, CB24_1.Date_Screening, CB24_1.ClientKey, CB24_1.ProgramAdmitKey, CB24_1.Composite_score, CB24_1.Depression_Results,CB24_1.Emotional_Results, CB24_1.Relationships_Results
            FROM FD__CNSLG_BASIS24 AS CB24_1
            WHERE (CB24_1.OP__DOCID =
                    (Select TOP(1) CB24_2.OP__DOCID
                    FROM FD__CNSLG_BASIS24 AS CB24_2
                                        Inner JOIN CNSL_Clients
                                            ON CB24_2.ClientKey = CNSL_Clients.ClientKey AND CB24_2.ProgramAdmitKey = CNSL_Clients.ProgramAdmitKey
                    WHERE (CB24_1.ClientKey = CB24_2.ClientKey) AND (CB24_1.ProgramAdmitKey = CB24_2.ProgramAdmitKey)
                    ORDER BY CB24_2.Date_Screening DESC))
)

SELECT F.OP__DOCID AS First_DOCID,R.OP__DOCID as Recent_DOCID,F.ClientKey, F.ProgramAdmitKey, F.Composite_Score AS FComposite_Score, R.Composite_Score as RComposite_Score, Composite_Change = R.Composite_Score - F.Composite_Score, F.Depression_Results AS FDepression_Results, R.Depression_Results AS RDepression_Resluts, Depression_Change = R.Depression_Results - F.Depression_Results, F.Emotional_Results AS FEmotional_Resluts, R.Emotional_Results AS REmotionall_Reslu, Emotional_Change = R.Emotional_Results - F.Emotional_Results, F.Relationships_Results AS FRelationships_Resluts, R.Relationships_Results AS RRelationships_Resluts, Relationship_Change = R.Relationships_Results - F.Relationships_Results
FROM First_basis AS F
        FULL Outer JOIN RECENT_BASIS AS R
            ON F.ClientKey = R.ClientKey AND F.ProgramAdmitKey = R.ProgramAdmitKey
ORDER BY F.ClientKey
END
GO

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2019-08-23
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多