应用条件逻辑

时间:2019-05-09 11:47:58

标签: sql

由于逻辑差和数据库外部的用户错误,我的设备可能会出现在许多文件中。我知道应该基于一组规则将其放在哪个文件中,并且我希望使用第三个布尔值或二进制响应类型列将其自动化。

这是表格外观的一个示例。您可以看到设备如何显示在多个文件中。

device | file
A        1862
A        1880
B        1880  
C        1901
C        1880

要应用的规则如下:

  • 如果装置在1862年成立,则为true(无论它是否在其他地方)
  • 如果1880年的设备也没有在1862年或1901年检查过,则为true
  • 如果1901年的设备为true(无论是否在其他地方)

我曾尝试使用自连接逻辑和大小写,但似乎无法正确处理。

这就是我要结束的事情。

device | file | Correct
A        1862   Yes  --it exists here so we don't care if it exists elsewhere
A        1880   No   --because it exists in 1862
B        1880   Yes  --because it does not exist in 1901 or 1862
C        1901   Yes  --it exists here so we don't care if it exists elsewhere
C        1880   No   --because it also exists in 1901

我只需要一个正确的输出,即在此阶段不需要校正表;这是为了证明表格需要更正:-)

2 个答案:

答案 0 :(得分:1)

使用CASE的3条规则:

select t.*, 
  case 
    when file in (1862, 1901) then 'Yes'
    when file = 1880 and not exists (
      select 1 from tablename
      where device = t.device and file in (1862, 1901)
    ) then 'Yes'
    else 'No'
  end Correct
from tablename t;

请参见demo
结果:

| device | file | Correct |
| ------ | ---- | ------- |
| A      | 1862 | Yes     |
| A      | 1880 | No      |
| B      | 1880 | Yes     |
| C      | 1901 | Yes     |
| C      | 1880 | No      |

答案 1 :(得分:0)

使用窗口功能:

select t.*,
       (case when file in (1862, 1901) then 'Yes'
             when file = 1880 and
                  sum(case when file in (1862, 1901) then 1 else 0 end) over (partition by device) = 0
             then 'Yes'
             else 'No'
        end) as flag 
from t;