按连续外键值分组的Sql查询
我有这样的数据:按连续外键值分组的Sql查询,sql,sql-server,Sql,Sql Server,我有这样的数据: +----+-------------------------+----------+----------+ | ID | DateReceived | Quantity | VendorID | +----+-------------------------+----------+----------+ | 1 | 2010-08-09 06:53:44.783 | 2 | 1 | | 2 | 2010-08-01 13:
+----+-------------------------+----------+----------+
| ID | DateReceived | Quantity | VendorID |
+----+-------------------------+----------+----------+
| 1 | 2010-08-09 06:53:44.783 | 2 | 1 |
| 2 | 2010-08-01 13:31:26.893 | 1 | 1 |
| 3 | 2010-07-26 07:52:29.403 | 2 | 1 |
| 4 | 2011-03-22 13:31:11.000 | 1 | 2 |
| 5 | 2011-03-22 13:31:11.000 | 1 | 2 |
| 6 | 2011-03-22 11:27:01.000 | 1 | 2 |
| 7 | 2011-03-18 09:04:58.000 | 1 | 1 |
| 8 | 2011-12-17 08:21:29.000 | 1 | 3 |
| 9 | 2012-08-10 10:55:20.000 | 9 | 3 |
| 10 | 2012-08-02 20:18:10.000 | 5 | 1 |
| 11 | 2012-07-12 20:44:36.000 | 3 | 1 |
| 12 | 2012-07-05 20:45:29.000 | 1 | 1 |
| 13 | 2013-03-22 13:31:11.000 | 1 | 2 |
| 14 | 2013-03-22 13:31:11.000 | 1 | 2 |
+----+-------------------------+----------+----------+
我想按接收日期对数据进行排序
并对数量
求和。但是,我想对由VendorID
分组的数量进行求和,只要它们相邻,就像下面的示例输出一样
+----------+----------+
| VendorID | Quantity |
+----------+----------+
| 1 | 5 |
| 2 | 3 |
| 1 | 1 |
| 3 | 10 |
| 1 | 9 |
| 2 | 2 |
+----------+----------+
我目前正在通过加载所有行并在应用程序代码中遍历它们来实现这一点。这是目前我想消除的软件瓶颈
生成所需输出的MS Sql Server查询是什么
注:对更好的标题有什么建议吗?在SQL Server 2005+中,您可以执行以下操作:
with cte as (
select
VendorID, Quantity,
row_number() over(partition by VendorID order by DateReceived) as rn1,
row_number() over(order by DateReceived) as rn2
from Table1
)
select
VendorID, sum(Quantity) as Quantity
from cte
group by VendorID, rn2 - rn1
order by min(rn2)
在SQL Server 2012中,可以使用lag()函数:
with cte as (
select
VendorID, Quantity, DateReceived,
case when lag(VendorID) over(order by DateReceived) <> VendorID then 1 else 0 end as rn
from Table1
), cte2 as (
select
VendorID, Quantity, sum(rn) over(order by DateReceived) as s
from cte
)
select
VendorID, sum(Quantity)
from cte2
group by VendorID, s
order by s asc
尝试以下解决方案:
SELECT z.VendorID, z.GroupID,
MIN(z.DateReceived) AS DateReceivedStart,
MAX(z.DateReceived) AS DateReceivedStop,
SUM(z.Quantity) AS SumOfQuantity
FROM
(
SELECT y.VendorID,
y.RowNum1 - y.RowNum2 AS GroupID,
y.DateReceived,
y.Quantity
FROM
(
SELECT *, ROW_NUMBER() OVER(ORDER BY x.DateReceived) AS RowNum1,
ROW_NUMBER() OVER(ORDER BY x.VendorID, x.DateReceived) AS RowNum2
FROM @MyTable x
) y
) z
GROUP BY z.VendorID, z.GroupID
ORDER BY DateReceivedStart
您使用的是什么版本的SQL Server?您所说的“相邻”是什么意思?正如在VendorID中一样
是另一个的+/-1吗?@w0lf我使用的是SQL server2005@Romoku实际上,真实数据中的VendorID
是一个GUID。我所说的“相邻”是指按接收日期排序时彼此相邻。我还问了MySQL同样的问题:SQL Server 2005及以上版本
SELECT z.VendorID, z.GroupID,
MIN(z.DateReceived) AS DateReceivedStart,
MAX(z.DateReceived) AS DateReceivedStop,
SUM(z.Quantity) AS SumOfQuantity
FROM
(
SELECT y.VendorID,
y.RowNum1 - y.RowNum2 AS GroupID,
y.DateReceived,
y.Quantity
FROM
(
SELECT *, ROW_NUMBER() OVER(ORDER BY x.DateReceived) AS RowNum1,
ROW_NUMBER() OVER(ORDER BY x.VendorID, x.DateReceived) AS RowNum2
FROM @MyTable x
) y
) z
GROUP BY z.VendorID, z.GroupID
ORDER BY DateReceivedStart