Sql 仅显示具有最高值的行

Sql 仅显示具有最高值的行,sql,Sql,在我的查询中,我返回了每周发生某些事情的天数。一切都很好,除了返回多行,其中只需要最高的行。例如,在我的查询中,如果TotalDays是3,我有一行表示1、2和3。如果是4,那么我有1、2、3和4的行,等等。我需要做什么才能得到最高的一行?我尝试同时使用ROW_NUMBER和MAX,但似乎不知道如何在案例中实现这一点 SELECT Employees.CustomerID, X.*, Customers.ReportID FROM ( SELECT CASE W

在我的查询中,我返回了每周发生某些事情的天数。一切都很好,除了返回多行,其中只需要最高的行。例如,在我的查询中,如果TotalDays是3,我有一行表示1、2和3。如果是4,那么我有1、2、3和4的行,等等。我需要做什么才能得到最高的一行?我尝试同时使用ROW_NUMBER和MAX,但似乎不知道如何在案例中实现这一点

SELECT Employees.CustomerID, X.*, Customers.ReportID
FROM 
    (
    SELECT
        CASE WHEN [M] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [W] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Th] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [F] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Su] = '1' THEN 1 ELSE 0 END AS DaysofWeek
    FROM
        Customers
    ) X, Employees INNER JOIN ON Employees.EmployeesID = Customers.EmployeesID
GROUP BY Employees.CustomerID, Customers.ReportID, X.DaysofWeek
没有更多的细节。对于任何给定的EmployeeID,都可以有无限的ReportID,我希望返回所有这些ID,但只返回DaysofWeek最高的位置

因此,EmployeeID 200可能每周2天返回报告1001和1002。我们应该展示的是

200     2     1001
200     2     1002
然而,目前显示的是:

200     1     1001
200     2     1001
200     1     1002
200     2     1002
修改了查询并添加了更多的表,尽管所有内容都返回值为5

WITH sub AS(
SELECT Shift1.EmployeeID, X.*, Schedule.Services, Schedule.ReportID
FROM 
    (
    SELECT
        CASE WHEN [M] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [W] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Th] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [F] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Su] = '1' THEN 1 ELSE 0 END AS DaysofWeek
    FROM
        Schedule
    ) X, Shift1 INNER JOIN (Shift2 INNER JOIN Schedule ON Shift2.Shift2ID = Schedule.Shift2ID) ON Shift1.Shift1ID = Shift2.Shift1ID
GROUP BY Shift1.EmployeeID, Schedule.Services, Schedule.ReportID, X.DaysofWeek
)
SELECT X.*
  FROM sub X
  JOIN (SELECT EmployeeID, ReportID, MAX(DaysofWeek) AS DaysofWeek
          FROM sub
         GROUP BY EmployeeID, ReportID) Y
   ON X.DaysofWeek = Y.DaysofWeek
   and X.EmployeeID = Y.EmployeeID
   and X.ReportID = Y.ReportID

查询本身可能能够得到更好的清理,但是,如果当前查询正在工作并向您显示所指示的输出,但您希望将其减少到您所指示的所需输出,那么您应该能够使用with子句执行以下操作:

with sub as(
SELECT Employees.CustomerID, X.*, Customers.ReportID
FROM 
    (
    SELECT
        CASE WHEN [M] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [W] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Th] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [F] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END +
        CASE WHEN [Su] = '1' THEN 1 ELSE 0 END AS DaysofWeek
    FROM
        Customers
    ) X INNER JOIN Employees ON Employees.EmployeesID = Customers.EmployeesID
GROUP BY Employees.CustomerID, Customers.ReportID, X.DaysofWeek
)
select x.*
  from sub x
  join (select customerid, reportid, max(daysofweek) as daysofweek
          from sub
         group by customerid, reportid) y
    on x.daysofweek = y.daysofweek
   and x.customerid = y.customerid
   and x.reportid = y.reportid

您的join子句也已关闭。

首先,您的查询应该如下所示:

SELECT e.CustomerID, c.DaysOfWeek, c.ReportId
FROM (SELECT c.*,
             (CASE WHEN [M] = '1' THEN 1 ELSE 0 END +
              CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END +
              CASE WHEN [W] = '1' THEN 1 ELSE 0 END +
              CASE WHEN [Th] = '1' THEN 1 ELSE 0 END +
              CASE WHEN [F] = '1' THEN 1 ELSE 0 END +
              CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END +
              CASE WHEN [Su] = '1' THEN 1 ELSE 0 END
             ) AS DaysofWeek
      FROM Customers c
     ) c JOIN
     Employees e
     ON e.EmployeesID = c.EmployeesID
GROUP BY e.CustomerID, c.ReportID, c.DaysofWeek;
我质疑联接为什么Employee.CustomerId不联接到Customers表?但这就是您的联接方式。要获取一周中最大日期的报告,请使用稠密等级:


为什么员工上有CustomerID字段?我搞不懂你的计划。您在评论中将200称为EmployeeID,但在SQL语句中有Employees.CustomerID。我认为您正在获得某种与customers表的自动联接。您正在从Customers表中选择内容,从技术上讲,该表不是您要从中选择的表之一。席中包含的RealTid和EnguleID在我的查询中有更多的数据,所以我去掉了几个不适用于这个特定问题的连接和附加数据。但是,在本例中,我们有一名员工将作为给定客户的销售代表,这就是为什么在员工中有一个客户ID字段的原因。但是您已经有了EmployeesID no客户。那么你是说员工和客户之间存在一对一的关系?实际上我要加入的还有5个表,但为了缩短代码,除了第一个和最后一个表外,我省略了所有表。问题是,它将所有值显示为5,即使给定CustomerID和ReportID的最高值为1。@doby48我想我刚才遗漏了ReportID的一个连接,你能试着以编辑的方式重新运行它吗?同样,在这种情况下,您应该能够更轻松地在内部查询中使用max,但是如果您还想选择其他不起作用的列,而上述操作应该起作用。没有这样的运气,所有值仍然只显示5。如果我删除MAXDaysofWeek,那么我会再次看到所有的重复项,因此我猜问题出在那里。@doby48如果这不起作用,那么您发布的查询和结果将不正确,请参阅,如果您确实获得了您提供的查询的输出,上面的查询将把它减少到您所说的您想要的程度。我在查询中添加了另一个表,并且在使用MAX时,仍然得到了一周中所有的5个表。在上面发布了我的更新代码。对我仍然做错的地方有什么建议吗?
SELECT e.CustomerID, c.DaysOfWeek, c.ReportId
FROM (SELECT c.*, DENSE_RANK() OVER (PARTITION BY c.EmployeesId ORDER BY DaysOfWeek DESC) as seqnum
      FROM (SELECT c.*,
                   (CASE WHEN [M] = '1' THEN 1 ELSE 0 END +
                    CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END +
                    CASE WHEN [W] = '1' THEN 1 ELSE 0 END +
                    CASE WHEN [Th] = '1' THEN 1 ELSE 0 END +
                    CASE WHEN [F] = '1' THEN 1 ELSE 0 END +
                    CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END +
                    CASE WHEN [Su] = '1' THEN 1 ELSE 0 END
                    ) AS DaysofWeek
            FROM Customers c
           ) c
     ) c JOIN
     Employees e
     ON e.EmployeesID = c.EmployeesID
WHERE seqnum = 1
GROUP BY e.CustomerID, c.ReportID, c.DaysofWeek;