我很想就此问题发表意见。
我需要显示特定日期/时间范围的订单记录列表。然后用#of Order 与" last" 顺序进行比较。 " Last" 可能意味着 上个月 或 去年
由于我要显示订单记录列表,我打算从去年的 或 获取记录 只有一次点击(即连同当前日期/时间范围的记录)
或,或者,我可以:
替代方法意味着对数据库进行 2次往返(但返回的数据较少)。或者我应该坚持使用我当前的方法(加载所有记录,包括 上个月 或 去年 )。
注意:网站和SQL服务器托管在Microsoft Azure Cloud中。但是我们将来可能会转向AWS。
由于
输入示例(为简单起见省略了一些字段,包括时间)
----------------------------------------------------------------
| Warehouse Id | Order Id | Product Id | Quantity | Order Date |
----------------------------------------------------------------
| 1 | 10 | 1 | 10 | 2016-09-25 |
| 1 | 9 | 5 | 5 | 2016-09-24 |
| 1 | 8 | 4 | 8 | 2016-09-23 |
| 1 | 7 | 6 | 2 | 2016-09-23 |
| 1 | 6 | 8 | 1 | 2016-09-23 |
| 1 | 5 | 1 | 2 | 2016-09-22 |
| 1 | 4 | 1 | 2 | 2016-09-21 |
| 1 | 3 | 5 | 10 | 2016-09-21 |
| 1 | 2 | 5 | 15 | 2016-08-12 |
| 1 | 1 | 5 | 5 | 2016-08-10 |
----------------------------------------------------------------
欲望输出:
Input:
WarehouseId: 1
StartDate: 2016-09-01 End Date: 2016-09-30)
Comparison type: Last Month (ie. StartDate: 2016-08-01 EndDate: 2016-08-31)
Output:
Warehouse: xxx
-------------------------------------------------
| Order Id | Product Id | Quantity | Order Date |
-------------------------------------------------
| 10 | 1 | 10 | 2016-09-25 |
| 9 | 5 | 5 | 2016-09-24 |
| 8 | 4 | 8 | 2016-09-23 |
| 7 | 6 | 2 | 2016-09-23 |
| 6 | 8 | 1 | 2016-09-23 |
| 5 | 1 | 2 | 2016-09-22 |
| 4 | 1 | 2 | 2016-09-21 |
| 3 | 5 | 10 | 2016-09-21 |
-------------------------------------------------
Total Order: 40 (increase 100% from last month)
所以,我现在正在做的是从2016-08-01到2016-09-30获取所有记录。这样我可以避免两次往返。
或者,我可以执行以下操作:
1. Get record from 2016-09-01 to 2016-09-30
var rec = (from rec in tblOrders
where (rec.WarehouseId == whsId) && (rec.OrderDate >= startDate) && (rec.OrderDate <= endDate)
select rec).ToList();
2. Then do the SUM of total order from 2016-08-01 to 2016-08-31 for comparison purposes
var recSum = (from rec in ef.tblOrders
where (rec.WarehouseId == whsId) && (rec.OrderDate >= cStartDate) && (rec.OrderDate <= cEndDate)
group rec by rec.WarehouseId into grec
select new
{
TotalQty = grec.Sum(x => x.Quantity),
}).FirstOrDefault();
答案 0 :(得分:1)
您可以使用窗口函数执行此操作:
select o.*
from (select o.*
sum(case when datetime is "last month" or "last year" then 1 else 0 end) over () as last_num_orders
from orders o
) o
where o.datetime between @date1 and @date2;
我很不清楚在这种情况下“最后”意味着什么。但是,您可以使用窗口函数执行所需操作,这是首选选项0
。