如何在不对SQL Server中的所有列进行分组时获取MAX()

时间:2015-06-06 00:48:49

标签: sql sql-server

我有这个问题。

INNER SELECT带回多条记录。外部有一个SUM& MAX所以我只有1条记录:

SELECT  z.EmployeeId,
                    SUM(z.PayrollGap) AS PayrollGap,
                    MAX(z.PayrollGap) AS PayrollGapMax
            FROM    (SELECT  DISTINCT
                            a.EmployeeId,
                            a.PayPeriodStart,
                            a.PayPeriodEnd,
                            b.PayPeriodStart AS NextStartDate,
                            CASE WHEN DATEDIFF(d, a.PayPeriodEnd, b.PayPeriodStart) - 1 < 0 THEN 0
                                 ELSE DATEDIFF(d, a.PayPeriodEnd, b.PayPeriodStart) - 1
                            END AS PayrollGap
                     FROM   EmployeePayroll a
                     LEFT JOIN EmployeePayroll b
                     ON     b.EmployeeId = a.EmployeeId
                            AND b.rn = a.rn + 1
                     WHERE  b.PayPeriodStart IS NOT NULL) z
            GROUP BY z.EmployeeId

MAX(z.PayrollGap)一起,我也需要抓住PayPeriodStart。

问题在于,如果我将列PayPeriodStart添加到查询中,它将带回多于1条记录,我需要执行MAX(z.PayrollGap)

如何运行此查询但同时将PayPeriodStart与MAX(z.PayrollGap)相关联?

3 个答案:

答案 0 :(得分:1)

尝试拆分查询:

;with cte as
(
    SELECT  DISTINCT
            a.EmployeeId,
            a.PayPeriodStart,
            a.PayPeriodEnd,
            b.PayPeriodStart AS NextStartDate,
            CASE WHEN DATEDIFF(d, a.PayPeriodEnd, b.PayPeriodStart) - 1 < 0 THEN 0
                 ELSE DATEDIFF(d, a.PayPeriodEnd, b.PayPeriodStart) - 1
            END AS PayrollGap
     FROM   EmployeePayroll a
     LEFT JOIN EmployeePayroll b
     ON     b.EmployeeId = a.EmployeeId
            AND b.rn = a.rn + 1
     WHERE  b.PayPeriodStart IS NOT NULL
),
res as
(
    SELECT  z.EmployeeId,
            SUM(z.PayrollGap) AS PayrollGap,
            MAX(z.PayrollGap) AS PayrollGapMax
    FROM    cte z   
    GROUP BY z.EmployeeId
)
select r.EmployeeId, r.PayrollGap, r.PayrollGapMax, c.PayPeriodStart
from res r
    join cte c on c.EmployeeId = r.EmployeeId
        and c.PayrollGap = r.PayrollGapMax

答案 1 :(得分:0)

如果我正确理解了这个问题,您需要将结果集加入EmployeePayroll以添加PayPeriodStart。

类似的东西:

componentRestrictions

哪个未优化。 或测试,因为没有样本数据。 或格式化得非常好。

答案 2 :(得分:0)

尝试:

from oauth2client.client import SignedJwtAssertionCredentials
from httplib2 import Http

client_email = 'xyz@developer.gserviceaccount.com'
with open("MyProject.p12") as f:
    private_key = f.read()

credentials = SignedJwtAssertionCredentials(client_email, private_key, 'https://www.googleapis.com/auth/sqlservice.admin', sub='abc@example.com')
gauth = credentials.authorize(Http())