我的表:
Items | Price | UpdateAt
1 | 2000 | 02/02/2015
2 | 4000 | 06/04/2015
3 | 2150 | 07/05/2015
4 | 1800 | 07/05/2015
5 | 5540 | 08/16/2015
4 | 1700 | 12/24/2015
5 | 5200 | 12/26/2015
2 | 3900 | 01/01/2016
4 | 2000 | 06/14/2016
正如您所看到的,这是一张在上次更新之前保留商品价格和旧价格的表格。
现在我需要找到以下行:
因此,根据这些条件,上表的结果应为:
Items | Price | UpdateAt
2 | 4000 | 06/04/2015
4 | 1800 | 07/05/2015
我可以通过这个实现我所需要的
Declare @LastUpdate date set @LastUpdate = DATEADD(YEAER, -1, GETDATE())
select Items, UpdateAt from ITEM_PRICE where Items in (
select Items from (
select Items, count(Items) as C from ITEM_PRICE group by Items) T
where T.C > 1)
and UpdateAt < @LastUpdate
但是因为我仍然是sqlserver中的新手,并且这需要在vb.net中完成,所以传递大量select中的查询似乎很邋and且难以维护。
所以,我想问一下是否有人能给我一个更简单的解决方案?
很抱歉,我编辑了我的问题,因为我在尝试@Tim Biegeleisen的答案之后需要再满足一个条件,这对于编辑之前的问题确实是正确的。我再也想不出来了。
为什么我需要所有这些条件,因为我需要清理表格:清除超过1年的数据,同时仍保持最新的商品价格。
答案 0 :(得分:1)
在下面的答案中,我使用子查询来识别去年表中出现的所有项目。这是要求更新价格“至少一次”。在外部查询中,我仅限制 old 的记录,而不是一年后的记录,这是需求的另一部分。使用DataTable dt = new DataTable("Person");
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Function", typeof(string));
for (int i = 0; i < dataGridView.Rows.Count; i++)
dt.Rows.Add(MyComboBox.Items.Add(dataGridView[2, i].Value.ToString()
,因为我们想要过滤掉不符合这两个标准的记录。
INNER JOIN
再一次,SQL Fiddle在模拟SQL Server时遇到了问题。但是我继续创建了一个MySQL中的小提琴,看起来与我的SQL Server答案几乎相同。您可以验证逻辑和输出是否正确。