【发布时间】:2023-03-06 10:01:01
【问题描述】:
我想编写一个 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
这就是我想做的:
- 过滤
organisation = Ikea所在的行 -
groupby by
Tour_ID像这样: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 在每组
Tour_ID中,查看A、B、C和D列中的最早日期。如果组中四列中最早的日期在2018-05-01和2018-05-31之间,则返回整个组。如果一行包含NA值,我想忽略NAs 并查看其余值中最早的日期。比如Tour_ID = a这组,最早的日期是2018-04-01,所以不符合条件。
总之,只有Tour_ID = b 和Tour_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 查询? 这是我的尝试:
"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"
但我不认为它正确选择了Tour_ID = c,因为使用了COALESCE。
对于Tour_ID = c的组,D列中有NA,所以COALESCE(MIN(D), '2119-01-01')返回2119-01-01。但它不应该,因为D 列中的最小值是2018-05-01,这必须与A、B 和C 列中的最小值进行比较。事实上,D 列中的2018-05-01 是整个组中的最小值,所以我认为COALESCE(MIN(D), '2119-01-01') 是错误的。
但我不知道有什么解决方案。任何帮助将不胜感激!
【问题讨论】:
-
是否只有 a、b、c、d 列?
-
有80列但这里我只关心这四个
标签: mysql sql group-by min coalesce