【发布时间】:2019-03-12 19:55:52
【问题描述】:
我有一些类似以下的数据:
--------------------------------------------------
Location Weight MarkedOldest plantId Date
--------------------------------------------------
101010 520 0 2 3/10/2019
105000 500 1 2 3/1/2019
105000 500 0 2 2/20/2019
并且要求能够覆盖此表中最旧的行。我在这里介绍了 MarkedOldest 列,以保留创建该行的实际日期。乍一看,您会看到表中的最后一行是最旧的,但是说用户希望将第二行设置为最旧的。没问题。
当我返回这些行的列表并要求显示每个位置的总重量时,我的问题出现了,最旧的位置首先显示。 这样的查询的理想输出将返回:
105000 1000lbs (3/1 and 2/20)
101010 520lbs 3/10
我已经编写了以下已接近的查询:
select z.Location, Sum(z.Weight), as Weight, z.Date
FROM
(select Location, Weight, MarkedOldest
from dbo.SomeTable WHERE MarkedOldest = 1 PlantId= 2
UNION
select Location, Weight, MarkedOldest
from dbo.SomeTable WHERE PlantId = 2) as z
Group by z.Location, z.MarkedOldest
Order By z.MarkedOldest desc
此查询产生以下输出:
105000 500lbs 3/1/2019
105000 500lbs 2/20/2019
101010 520lbs 3/10/2019
这里的想法是首先选择任何手动输入的最旧的行,然后以最旧的第一顺序将它们与剩余的行合并。上面的输出几乎是正确的,但我想合并/删除前两行的重复位置。但是我认为我不能这样做,因为我按列“MarkedOldest”和“Date”分组
还有其他方法可以解决此查询以获得预期的输出吗?在尝试删除一些 groupby 或 orderby 列等操作时,我遇到了很多 groupBy/aggregate 错误。
【问题讨论】:
-
我不会不断更新 MarkedOldest,而是创建一个
VIEW。然后,您可以使用row_number()或其他窗口函数(如rank())来获取/标记您的行并进行聚合。有lots of examples关于如何在SO上获得"most current for a group" or "latest record for a group"。 -
@scsimon FWIW,我不会打扰视图
-
公平点@Strawberry
标签: sql sql-server group-by sql-order-by union