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