选择特定日期中具有多个ID的所有行

时间:2016-07-13 08:44:18

标签: sql-server

我的表:

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

正如您所看到的,这是一张在上次更新之前保留商品价格和旧价格的表格。

现在我需要找到以下行:

  • UpdateAt从现在开始超过1年
  • 以来必须至少更新一次价格
  • 不是最新价格

因此,根据这些条件,上表的结果应为:

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年的数据,同时仍保持最新的商品价格。

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答案几乎相同。您可以验证逻辑和输出是否正确。

SQLFiddle