【问题标题】:How can update the statement finding the day with the highest value and second highest value如何更新查找具有最高值和次高值的日期的语句
【发布时间】:2012-07-01 22:09:58
【问题描述】:

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

Id menu(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

我可以用 UPDATE Menu SET YES/NO = 1 WHERE DAY = 4

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

【问题讨论】:

  • 尝试UPDATE menu SET yes_no=1 WHERE day=MAX(day) OR day=(MAX(day)-1); 或者如果没有顺序并且您不知道第二个最大值将低于最大值,那么UPDATE menu SET yes_no=1 WHERE day=MAX(day) OR day=(SELECT MAX(day) FROM menu WHERE day<MAX(day));
  • 你想做什么?我从您的描述中看不到您如何在 ID = 101 的行中获得 0;实际上,也不是 100 或 102。“日列中的最高两个值”是 4 和 5,因此所有较早的值(1、2、3)都应该将是/否位设置为否,不是吗? ?

标签: sql


【解决方案1】:

测试驱动的查询设计 (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)
             )

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

选择包含第二个最大值或最大值的行

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

这些是需要将是/否位设置为 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2013-06-23
    • 2019-04-11
    • 2011-03-21
    • 2022-11-02
    相关资源
    最近更新 更多