繁体   English   中英

SQL查询GROUP BY,返回与LEAST,COALESCE条件匹配的组

[英]SQL query for GROUP BY, return groups that match the conditions of LEAST, COALESCE

我想编写一个SQL查询,查询条件复杂的几列。 我正在使用RMySQL包开发R Studio。 我的服务器是MySQL。

该表如下所示。

organisation    Tour_ID             A           B           C           D  
Ikea                  a    2018-04-01  2018-05-07  2018-05-09  2018-05-01
Ikea                  a    2018-06-01  2018-05-03  2018-05-29          NA   
Ikea                  a    2018-04-02  2018-05-01  2018-07-08  2018-05-26 
Ikea                  b    2018-06-02  2018-05-01          NA  2018-05-26
Ikea                  b    2018-06-02  2018-05-01          NA  2018-05-26
Ikea                  b            NA  2018-05-05  2018-08-02  2018-06-01
Ikea                  c    2018-06-01  2018-05-07  2018-05-09  2018-05-01
Ikea                  c    2018-06-01  2018-05-03          NA          NA   
Ikea                  c    2018-08-02  2018-05-09  2018-07-08  2018-05-26

这就是我想做的:

  1. 过滤organisation = Ikea的行
  2. Tour_ID例如:

     organisation Tour_ID ABCD Ikea a 2018-04-01 2018-05-07 2018-05-09 2018-05-01 Ikea a 2018-06-01 2018-05-03 2018-05-29 NA Ikea a 2018-04-02 2018-05-01 2018-07-08 2018-05-26 Ikea b 2018-06-02 2018-05-01 NA 2018-05-26 Ikea b 2018-06-02 2018-05-01 NA 2018-05-26 Ikea b NA 2018-05-05 2018-08-02 2018-06-01 Ikea c 2018-06-01 2018-05-07 2018-05-09 2018-05-01 Ikea c 2018-06-01 2018-05-03 NA NA Ikea c 2018-08-02 2018-05-09 2018-07-08 2018-05-26 
  3. Tour_ID每个组中,查看ABCD列中最早的日期。 如果组中四列中最早的日期是在2018-05-012018-05-31之间,则返回整个组。 如果一行包含NA值,我想忽略NA ,看看其余值中最早的日期是什么。 例如,对于该组的Tour_ID = a ,最早日期是2018-04-01 ,因此它不符合的标准。

总之,只有Tour_ID = bTour_ID = c符合条件。 结果应为:

organisation    Tour_ID             A           B           C           D
Ikea                  b    2018-06-02  2018-05-01          NA  2018-05-26
Ikea                  b    2018-06-02  2018-05-01          NA  2018-05-26
Ikea                  b            NA  2018-05-05  2018-08-02  2018-06-01
Ikea                  c    2018-06-01  2018-05-07  2018-05-09  2018-05-01
Ikea                  c    2018-06-01  2018-05-03          NA          NA   
Ikea                  c    2018-08-02  2018-05-09  2018-07-08  2018-05-26

我应该如何编写SQL查询? 这是我的尝试,但我只是不知道如何进行groupby,以及如何返回整个组,而不仅仅是返回日期最早的行。

SELECT *
FROM myTable 
WHERE organisation LIKE 'Ikea' AND
GROUP BY 'Tour_ID' 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'将取代NA)

感谢您的任何帮助!

添加:按照Gordon的回答,在这里我重写了SQL语句。

"SELECT t.* FROM myTable JOIN (SELECT organisation, Tour_ID 
                                                   FROM myTable
                                                   WHERE organisation LIKE 'Ikea' AND
                                                   GROUP BY organisation, Tour_ID
                                                   HAVING LEAST(COALESCE(MIN(A), '2119-01-01'), 
                                                                COALESCE(MIN(B), '2119-01-01'), 
                                                                COALESCE(MIN(C), '2119-01-01'), 
                                                                COALESCE(MIN(D), '2119-01-01')) >= '2018-05-01' AND
                                                          LEAST(COALESCE(MIN(A), '2119-01-01'), 
                                                                COALESCE(MIN(B), '2119-01-01'), 
                                                                COALESCE(MIN(C), '2119-01-01'), 
                                                                COALESCE(MIN(D), '2119-01-01')) < '2018-06-01'
                                                  ) tt
                                                  ON tt.Tour_ID = t.Tour_ID AND
                                                     tt.organisation = t.organisation"

我从RMySQL包运行了dbGetQuery 但是我收到以下错误。 我不明白,因为GROUP BY部分似乎还可以。 有谁知道为什么我会收到此错误?

dbGetQuery(connection = connection, statement = condition)

Error in .local(conn, statement, ...) : could not run statement: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY organisation, Tour_ID HAVING LEAST(COALESCE(A' at line 1

首先获取符合条件的tour_id

SELECT Tour_ID
FROM myTable 
WHERE organisation LIKE 'Ikea'
GROUP BY Tour_ID
HAVING LEAST(COALESCE(MIN(A), '2019-01-01'), COALESCE(MIN(B), '2019-01-01'), COALESCE(MIN(C), '2019-01-01'), COALESCE(MIN(D), '2019-01-01')) >= '2018-05-01' AND
       LEAST(COALESCE(MIN(A), '2019-01-01'), COALESCE(MIN(B), '2019-01-01'), COALESCE(MIN(C), '2019-01-01'), COALESCE(MIN(D), '2019-01-01')) < '2018-06-01';

然后将其放入查询中以获取原始行。 这是一种方法:

select t.*
from mytable t join
     (SELECT organisation, Tour_ID
      FROM myTable 
      WHERE organisation LIKE 'Ikea'
      GROUP BY organisation, Tour_ID
      HAVING LEAST(COALESCE(MIN(A), '2019-01-01'), COALESCE(MIN(B), '2019-01-01'), COALESCE(MIN(C), '2019-01-01'), COALESCE(MIN(D), '2019-01-01')) >= '2018-05-01' AND
             LEAST(COALESCE(MIN(A), '2019-01-01'), COALESCE(MIN(B), '2019-01-01'), COALESCE(MIN(C), '2019-01-01'), COALESCE(MIN(D), '2019-01-01')) < '2018-06-01'
     ) tt
     ON tt.tour_id = t.tour_id AND
        tt.organisation = t.organisation;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM