以下是我表格中的重要栏目
C:>DIR /B /A:D
R100_20170501_HF300_check1234
R200_20170621_HF122_TEST1234
R200_20170622_HF123_DF_25439
R300_20170622_HF99_DF_25439
C:>TYPE h.ps1
Get-ChildItem -Directory -Filter "*_HF*_*" |
Where-Object { $_.Name -match '.*_HF([0-9]*)_.*' } |
ForEach-Object { "$($matches[1])" } |
Measure-Object -Maximum |
ForEach-Object { $_.Maximum }
C:>powershell -NoProfile -File h.ps1
300
在ItemID增加到2之前,rowID增加到141.此循环重复约1.22亿行。
我需要以6的组为单位计算CalculatedNum字段。所以总和1-6,然后是7-12,等等。我知道最后我得到一个奇数。我可以丢弃最后三行(139,140和141号)。当我到达下一个ItemID时,我需要它再次启动SUM循环。
我知道我需要按ItemID进行分组,但是我一直在努力弄清楚如何将SQL一次只用6个CalculatedNum。基于值相同的列,我遇到的所有其他东西都是。
我确实在微软的网站上找到了一些使用ROW_NUMBER功能的东西,但我无法理解它。如果这个问题不明确,请告诉我。
谢谢
答案 0 :(得分:2)
您需要按(RowId - 1)/ 6和ItemId进行分组。像这样:
async
答案 1 :(得分:1)
您可以使用整数除法和分组依据。
SELECT ItemId, (RowId-1)/6 as Batch, sum(CalculatedNum)
FROM your_table GROUP BY ItemId, Batch
丢弃不完整的批次:
SELECT ItemId, (RowId-1)/6 as Batch, sum(CalculatedNum), count(*) as Cnt
FROM your_table GROUP BY ItemId, Batch HAVING Cnt = 6
编辑:修正了一个错误。
答案 2 :(得分:0)
为了确保您一次查询6行,您可以尝试使用模数函数:https://technet.microsoft.com/fr-fr/library/ms173482(v=sql.110).aspx
希望这可以提供帮助。
答案 3 :(得分:0)
谢谢大家。这真的很有帮助。
这是我们最终的目标。
SELECT ItemID, MIN(RowID) AS StartingRow, SUM(CalculatedNum)
FROM dbo.table
GROUP BY ItemID, (RowID - 1) / 6
ORDER BY ItemID, StartingRow
我不确定为什么它不喜欢select语句中的整数除法,但是我根据数据样本检查结果并且数学是正确的。