首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用条件调用多列的SQL查询(使用NAs)

用条件调用多列的SQL查询(使用NAs)
EN

Stack Overflow用户
提问于 2018-06-26 12:40:41
回答 3查看 81关注 0票数 1

这是来自我的前一个问题的一个连续的问题。我想编写一个SQL查询,调用几个有条件的列。我正在使用RMySQL包开发R Studio。我的服务器是MySQL。

桌子看起来像这样。

代码语言:javascript
复制
organisation          A           B           C           D
Ikea         2018-04-01  2018-05-07  2018-05-09  2018-05-01
Ikea         2018-06-01  2018-05-03  2018-05-29          NA   
Orange       2018-04-02  2018-05-01  2018-07-08  2018-05-26 
Ikea         2018-06-02  2018-05-01          NA  2018-05-26
Nestle       2018-06-02  2018-05-01          NA  2018-05-26
Ikea                 NA  2018-05-05  2018-04-02  2018-06-01

我想找一排,这个组织是宜家,四栏(A,B,C,D)最早的日期是2018-05-01和2018-05-31。

在包含NA值的行中,我想忽略NAs,看看其余值中最早的日期是什么。例如,对于第二行,最早的日期是“2018-05-03”(B栏),因此它符合标准。

因此,只有第二行,即上面原始表的第四行,才符合条件。我想得到的结果应该是:

代码语言:javascript
复制
organisation          A           B           C           D
Ikea         2018-06-01  2018-05-03  2018-05-29          NA    
Ikea         2018-06-02  2018-05-01          NA  2018-05-26

如何编写SQL查询?以下是我从前一个问题中得到答案后的尝试,但是对于带有NAs的行,它并不能很好地工作。

代码语言:javascript
复制
SELECT * FROM myTable 
WHERE organisation LIKE Ikea
LEAST(A, B, C, D) >= '2018-05-01' AND
LEAST(A, B, C, D) < '2018-06-01'

感谢您的各种帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-26 13:52:06

只需使用coalesce()

代码语言:javascript
复制
SELECT *
FROM myTable 
WHERE organisation LIKE 'Ikea' AND
      LEAST(COALESCE(A, '2019-01-01'), COALESCE(B, '2019-01-01'), COALESCE(C, '2019-01-01'), COALESCE(D, '2019-01-01')) >= '2018-05-01' AND
      LEAST(COALESCE(A, '2019-01-01'), COALESCE(B, '2019-01-01'), COALESCE(C, '2019-01-01'), COALESCE(D, '2019-01-01')) < '2018-06-01';

'2019-01-01'是范围之后的任意日期。

票数 0
EN

Stack Overflow用户

发布于 2018-06-26 12:46:51

您可以尝试对值使用IFNULL(),并且使用getdate(),所以如果它是null,那么它现在就只使用,然后就不会被认为是最小的,这基本上就是忽略它们。

喜欢:LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate()))

希望这能把你推向正确的方向。

除非NA是一个字符串,否则您可以使用像case when A = 'NA' THEN getdate() end这样的case语句

可能最终看起来像这样

代码语言:javascript
复制
SELECT * FROM myTable 
WHERE organisation LIKE Ikea
LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate())) >= '2018-05-01' AND
LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate())) < '2018-06-01'

代码语言:javascript
复制
SELECT * FROM myTable 
WHERE organisation LIKE Ikea
LEAST(case when A = 'NA' THEN getdate() else A end, case when B = 'NA' THEN getdate() else B end, case when C = 'NA' THEN getdate() else C end, case when D = 'NA' THEN getdate() else D end) >= '2018-05-01' AND
LEAST(case when A = 'NA' THEN getdate() else A end, case when B = 'NA' THEN getdate() else B end, case when C = 'NA' THEN getdate() else C end, case when D = 'NA' THEN getdate() else D end) < '2018-06-01'
票数 0
EN

Stack Overflow用户

发布于 2018-06-26 13:52:53

考虑加入使用UNION ALL派生的聚合查询

代码语言:javascript
复制
SELECT m.*
FROM myTable m
INNER JOIN 
   (SELECT t.ID, MIN(t.`DateValue`) As MinDate
    FROM 
       (SELECT ID, organisation, 'A' As 'Category', A As `DateValue` FROM myTable
        UNION ALL
        SELECT ID, organisation, 'B' As 'Category', B As `DateValue` FROM myTable
        UNION ALL
        SELECT ID, organisation, 'C' As 'Category', C As `DateValue` FROM myTable
        UNION ALL
        SELECT ID, organisation, 'D' As 'Category', D As `DateValue` FROM myTable) As t
    WHERE t.organisation = 'Ikea'
    GROUP BY t.ID
    HAVING MIN(t.`DateValue`) >= '2018-05-01' AND MIN(t.`DateValue`) < '2018-06-01') As agg
ON m.ID = agg.ID;

RexTester演示 (注:日期采用DD-MM-YYYY格式)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51043189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档