如何更新查找具有最高值和第二高值的日期的语句

时间:2012-07-01 22:09:58

标签: sql

我需要更改“是”/“否”列,其中日期列具有最高值和第二高值。

Id菜单(INT NOT NULL PRIMARY KEY);日(INT NULL);是/否(BIT NUL)
100; 1; 1
101; 2; 0
102; 3; 1
103; 4; 0
104; 5; 0

我应该得到的结果是 Id菜单(INT NOT NULL PRIMARY KEY);日(INT NULL);是/否(BIT NUL)
100; 1; 1
101; 2; 0
102; 3; 1
103; 4; 1
104; 5; 1

我可以改变这一行 更新菜单设置是/否= 1天数= 4

但是,由于日子将继续上升,这意味着我必须知道哪一天是写作声明的最高日期。如何更新查找具有最高值和第二高值的日期的语句 我尝试了UPDATE菜单SET YES / NO = 1 WHERE MAX(day)

1 个答案:

答案 0 :(得分:0)

测试驱动查询设计(TDQD)再次拯救。

查找最大日期值

SELECT MAX(day) FROM Menu

查找第二个最大日值

SELECT MAX(day)
  FROM Menu
 WHERE day != (SELECT MAX(day) FROM Menu)

第二个最大日期是最大日值,而不是最大日值。

选择不包含第二个最大值或最大日值

的行
SELECT *
  FROM Menu
 WHERE Day < (SELECT MAX(day)
                FROM Menu
               WHERE day != (SELECT MAX(day) FROM Menu)
             )

这些是需要将No / No位设置为零的行。

选择包含第二个最大或最大日值

的行
SELECT *
  FROM Menu
 WHERE Day >= (SELECT MAX(day)
                 FROM Menu
                WHERE day != (SELECT MAX(day) FROM Menu)
              )

这些是需要将No / No位设置为1的行。

更新两组行

显然,您可以将SELECT *替换为UPDATE Menu SET Yes_No = 0(或1)两组数据。如果您的DBMS允许您从正在更新的表中进行选择(并非所有DBMS都这样做),您可以将这两者合并为一个操作:

UPDATE Menu
   SET Yes_No = (CASE WHEN day < (SELECT MAX(day) FROM Menu
                                   WHERE day != (SELECT MAX(day) FROM Menu))
                      THEN 0
                      ELSE 1 END)