SQL Server查询某个日期段内的平均值

时间:2019-12-21 03:12:59

标签: sql sql-server

DECLARE @SampleOrderTable TABLE
                          (
                               pkPersonID INT,
                               OrderDate DATETIME,
                               Amount NUMERIC(18, 6)
                          )

INSERT INTO @SampleOrderTable (pkPersonID, OrderDate, Amount) 
VALUES (1, '12/10/2019', '762.84'),
       (2, '11/10/2019', '886.32'),
       (3, '11/9/2019', '10245.00')

如何选择OrderDate之前的最后4天以及该期间的平均金额?

所以结果数据将是:

pkPersonID   Date             Amount
------------------------------------
    1        '12/7/2019'     190.71
    1        '12/8/2019'     190.71
    1        '12/9/2019'     190.71
    1        '12/10/2019'    190.71
    2        '12/7/2019'     221.58
    2        '12/8/2019'     221.58
    2        '12/9/2019'     221.58
    2        '12/10/2019'    221.58
    3        '11/6/2019'    2561.25
    3        '11/7/2019'    2561.25
    3        '11/8/2019'    2561.25
    3        '11/9/2019'    2561.25

3 个答案:

答案 0 :(得分:0)

您可以使用诸如AVG,DATEADD和GETDATE之类的sql函数。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    centerViewOnUserLocation()
}

答案 1 :(得分:0)

您可以尝试使用以下方法,使用DATEADD(),窗口化的COUNT()VALUES()表值构造函数:

表格:

DECLARE @SampleOrderTable TABLE (
   pkPersonID INT,
   OrderDate DATETIME,
   Amount NUMERIC(18, 6)
)
INSERT INTO @SampleOrderTable (pkPersonID, OrderDate, Amount) 
VALUES (1, '20191210', '762.84'),
       (2, '20191210', '886.32'),
       (3, '20191109', '10245.00')

声明:

SELECT 
   t.pkPersonID,
   DATEADD(day, -v.Day, t.OrderDate) AS [Date],
   CONVERT(numeric(18, 6), Amount / COUNT(Amount) OVER (PARTITION BY t.pkPersonID)) AS Amount
FROM @SampleOrderTable t
CROSS APPLY (VALUES (0), (1), (2), (3)) v(Day)
ORDER BY t.pkPersonID, [Date]

结果:

pkPersonID  Date                Amount
1           07/12/2019 00:00:00 190.710000
1           08/12/2019 00:00:00 190.710000
1           09/12/2019 00:00:00 190.710000
1           10/12/2019 00:00:00 190.710000
2           07/12/2019 00:00:00 221.580000
2           08/12/2019 00:00:00 221.580000
2           09/12/2019 00:00:00 221.580000
2           10/12/2019 00:00:00 221.580000
3           06/11/2019 00:00:00 2561.250000
3           07/11/2019 00:00:00 2561.250000
3           08/11/2019 00:00:00 2561.250000
3           09/11/2019 00:00:00 2561.250000

答案 2 :(得分:0)

DECLARE @SampleOrderTable TABLE (
  pkPersonID INT,
  OrderDate DATETIME,
  Amount NUMERIC(18, 6)
);

INSERT INTO @SampleOrderTable
  (pkPersonID, OrderDate, Amount) 
VALUES
  (1, '12/20/2019', 762.84),
  (2, '12/20/2019', 886.32),
  (3, '12/20/2019', 10245.00),
  (4, '12/19/2019', 50.00),
  (5, '12/19/2019', 100.00),
  (6, '09/01/2019', 200.00),
  (7, '09/01/2019', 300.00),
  (8, '12/15/2019', 400.00),
  (9, '12/15/2019', 500.00),
  (10, '09/02/2019', 150.00),
  (11, '09/02/2019', 1100.00),
  (12, '09/02/2019', 1200.00),
  (13, '09/02/2019', 1300.00),
  (14, '09/02/2019', 1400.00),
  (15, '09/02/2019', 1500.00);

SELECT OrderDate,AVG(Amount) AS Average_Value
FROM @SampleOrderTable
WHERE DATEDIFF(DAY, CAST(OrderDate AS DATETIME), CAST(GETDATE() AS Datetime)) <= 4
GROUP BY OrderDate;