我有需要为我们的营销客户更新的存储过程。
我有两个表变量,填充没有问题。
目前我有一个 WHILE 循环(见下文),可以毫无问题地将 @SalesTable 内容处理到第三个表变量 @SalesAndAdsTable 中。
现在的问题是尝试在外循环的每 X 次迭代中从第二个表变量 @AdsTable 插入数据。
我的想法是尝试找出两个表之间的行偏移量,并使用该数字作为指示器将 @AdsTable 记录插入到 @SalesAndAdsTable 中。
这是一个好主意还是还有其他方法?
@SalesTable 和 @AdsTable 都被填充后的代码片段如下:
SET @OffSet = (SELECT @SalesTableCnt/@AdsTableCnt);
WHILE (SELECT COUNT(*) FROM @SalesTable WHERE processed = 0) > 0
BEGIN
SELECT TOP 1 @SaleId = saleid FROM @SalesTable WHERE processed = 0 ORDER BY dateadded DESC;
-- check if @OffSet matches the @SaleCnt, INSERT AD Record into @SalesAndAdsTable, update @AdsTable setting processed = 1, RESET @SaleCnt to 0
-- INSERT this SALE record into @SalesAndAdsTable
INSERT INTO @SalesAndAdsTable SELECT * FROM @SalesTable WHERE saleid = @SaleId;
-- C. Finally, update the table variable, set the 'Processed' column of the processed row to 1.
UPDATE @SalesTable SET processed = 1 Where saleid = @SaleId;
--AD INJECTION...
IF @OffSet = @SaleCnt AND @OffSet >= 0
BEGIN
SELECT TOP 1 @AdId = saleid FROM @AdsTable WHERE processed = 0 ORDER BY dateadded DESC;;
-- INSERT this AD record into @SalesAndAdsTable
INSERT INTO @SalesAndAdsTable SELECT * FROM @AdsTable WHERE @AdId = saleid;
UPDATE @AdsTable SET processed = 1 Where saleid = @AdId;
SET @SaleCnt = 0;
SET @AdCnt = @AdCnt + 1;
--SELECT @AdId as '@AdId';
END
-- increase this loops counter variable
SET @SaleCnt = @SaleCnt + 1;
--SELECT @SaleCnt as '@SaleCnt', @OffSet as '@OffSet', @SaleId as '@SaleId';
END
目前,所有必需的记录都已插入到 @SalesAndAdsTable 中,但前两条广告记录似乎是同时插入的。我想我已经很接近了。
感谢您的任何建议,乔
在没有看到一些示例数据和预期结果的情况下,我不确定您到底想要实现什么目标,但您似乎希望在销售记录中均匀分布广告记录??
如果添加的日期是主要排序,那么只需在最终的 ORDER BY 中更改它,在这种情况下,您可能不需要任何偏移代码(但我再次猜测。
如果这没有帮助,请显示一些示例数据和预期结果。
如果这是正确的那么这应该可以解决问题
-- Set up some sample data
DECLARE @Sales TABLE (SaleID int, DateAdded date, SomeText varchar(10), SomeNumber decimal(10,2))
DECLARE @Ads TABLE (AdID int, DateAdded date, SomeText varchar(10), SomeNumber decimal(10,2))
INSERT INTO @Sales VALUES
(50, '2023-09-15', 'Sale', 11.1), (30, '2023-09-16', 'Sale', 22.2), (35, '2023-09-17', 'Sale', 33.3), (8, '2023-09-18', 'Sale', 44.4),
(9, '2023-09-19', 'Sale', 55.5), (55, '2023-09-20', 'Sale', 66.6), (99, '2023-09-21', 'Sale', 77.7), (33, '2023-09-22', 'Sale', 88.8)
INSERT INTO @Ads VALUES (1, '2023-09-15', 'Ad', 1.1), (2, '2023-09-20', 'Ad', 2.2),(3, '2023-09-21', 'Ad', 3.3)
-- The query
DECLARE @Offset Decimal(10,5) = ((SELECT CAST(COUNT(*) as decimal(10,5)) FROM @Sales) / ((SELECT CAST(COUNT(*) as decimal(10,5)) FROM @Ads)))
select *, ROW_NUMBER() OVER(ORDER BY DateAdded DESC) as rn from @Sales
UNION ALL
select *, (ROW_NUMBER() OVER(ORDER BY DateAdded DESC) * @Offset) + 0.00001 as rn from @Ads
ORDER BY rn
第一部分只是设置一些示例数据。我在每个表格中都包含了“销售”或“广告”一词,以便结果更易于阅读。
秒部分只有两个语句,第一个获取偏移量,第二个仅执行两个查询的并集。
如果这是在一个大表上工作,这应该比循环快得多(这通常是一个坏主意)。
这是结果。