[英]How do I filter one column based on the values of another column?
I apologize in advanced for the long post. 对于长篇文章,我深表歉意。 It's a couple of case statements that make it really long.
这是几个案例陈述,使它变得很长。
I have two questions. 我有两个问题。 The first is -- how do I get all the values from a table, but also filter it against itself in a self join?
第一个是-我如何从表中获取所有值,又如何在自联接中针对自身过滤呢? Specifically, I am counting the number of calls salespeople made per day and my output keeps cutting off 12am and 1am.
具体来说,我计算的是推销员每天的通话次数,而我的输出则持续减少凌晨12点和凌晨1点。
The second question is -- how do I filter one column based on the values of another column? 第二个问题是-如何根据另一列的值过滤一列?
Some of my salespeople are in New York, so I want to say when created_by LIKE 'Johnny Smith' THEN subtract 3 from TIME. 我的一些销售人员在纽约,所以我想说当created_by LIKE'Johnny Smith'然后从TIME中减去3时。 No clue how to do that!
不知道该怎么做!
Here's my example-- 这是我的例子
This is what my query looks like... 这就是我的查询的样子...
SELECT CASE
WHEN (EXTRACT(HOUR
FROM task1.time)) = 1 THEN '1am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 2 THEN '2am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 3 THEN '3am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 4 THEN '4am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 5 THEN '5am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 6 THEN '6am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 7 THEN '7am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 8 THEN '8am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 9 THEN '9am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 10 THEN '10am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 11 THEN '11am'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 12 THEN '12pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 13 THEN '1pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 14 THEN '2pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 15 THEN '3pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 16 THEN '4pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 17 THEN '5pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 18 THEN '6pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 19 THEN '7pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 20 THEN '8pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 21 THEN '9pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 22 THEN '10pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 23 THEN '11pm'
WHEN (EXTRACT(HOUR
FROM task1.time)) = 0 THEN '12am'
END AS hour,
COUNT(task2.Activity_ID__Case_Safe_) AS calls
FROM sdr_data.by_task AS task1
LEFT JOIN sdr_data.by_task AS task2
ON task1.Activity_ID__Case_Safe_ = task2.Activity_ID__Case_Safe_
AND task2.task_type LIKE 'Call'
AND task2.status LIKE 'Completed'
AND task2.created_date > DATE_SUB(CURRENT_DATE(), INTERVAL 1
WEEK)
LEFT JOIN
(SELECT account_id__CaseSafe_
FROM sdr_data.by_task
WHERE account_id__CaseSafe_ IN
(SELECT account_id__CaseSafe_
FROM {{@dummy_accounts}})) AS subquery
ON task2.account_id__CaseSafe_ = subquery.account_id__CaseSafe_
RIGHT JOIN
(SELECT created_by,
Activity_ID__Case_Safe_
FROM sdr_data.by_task
WHERE created_by IN
(SELECT full_name
FROM {{@active_salespeople}}) ) AS subquery2
ON task1.Activity_ID__Case_Safe_ = subquery2.Activity_ID__Case_Safe_
WHERE task1.created_by IS NOT NULL
AND subquery.account_id__CaseSafe_ IS NULL
GROUP BY 1
ORDER BY CASE
WHEN HOUR LIKE '12am' THEN 1
WHEN HOUR LIKE '1am' THEN 2
WHEN HOUR LIKE '2am' THEN 3
WHEN HOUR LIKE '3am' THEN 4
WHEN HOUR LIKE '4am' THEN 5
WHEN HOUR LIKE '5am' THEN 6
WHEN HOUR LIKE '6am' THEN 7
WHEN HOUR LIKE '7am' THEN 8
WHEN HOUR LIKE '8am' THEN 9
WHEN HOUR LIKE '9am' THEN 10
WHEN HOUR LIKE '10am' THEN 11
WHEN HOUR LIKE '11am' THEN 12
WHEN HOUR LIKE '12pm' THEN 13
WHEN HOUR LIKE '1pm' THEN 14
WHEN HOUR LIKE '2pm' THEN 15
WHEN HOUR LIKE '3pm' THEN 16
WHEN HOUR LIKE '4pm' THEN 17
WHEN HOUR LIKE '5pm' THEN 18
WHEN HOUR LIKE '6pm' THEN 19
WHEN HOUR LIKE '7pm' THEN 20
WHEN HOUR LIKE '8pm' THEN 21
WHEN HOUR LIKE '9pm' THEN 22
WHEN HOUR LIKE '10pm' THEN 23
WHEN HOUR LIKE '11pm' THEN 24
END
For context, the first join is to filter out the tasks so I just get completed calls. 对于上下文,第一个联接是过滤掉任务,因此我只需要完成呼叫。 The second join is to get rid of bad/fake accounts and the third join is to make sure it only pulls names from the "active-salespeople" list.
第二个连接是摆脱不良/虚假帐户,第三个连接是确保仅从“活跃销售人员”列表中提取名称。
Here's an example of what my source data looks like -- 这是我的源数据看起来像的一个例子-
Created By Task Type Time Status Activity ID (Case Safe)
Rudolph Ronald Call 2015-12-21 12:56:00 Completed 61AA
Joey Jalla Call 2015-12-21 12:56:00 Completed 61BB
Mike McCrystal Call 2015-12-21 12:56:00 Completed 61CC
Sally Susie Email 2015-12-21 12:56:00 Open 61DD
Sally Susie Email 2015-12-21 12:56:00 Open 61EE
Sally Susie Meeting 2015-12-21 12:56:00 Completed 61FF
My output looks like this -- 我的输出看起来像这样-
hour calls
2am 5
3am 14
4am 8
5am 20
6am 52
7am 55
8am 145
9am 90
10am 106
11am 93
12pm 96
1pm 53
2pm 54
3pm 43
4pm 20
5pm 8
6pm 4
7pm 17
8pm 9
9pm 12
11pm 6
But I want it to look like -- 但我希望它看起来像-
hour calls
12am 2
1am 4
2am 5
3am 14
4am 8
5am 20
6am 52
7am 55
8am 145
9am 90
10am 106
11am 93
12pm 96
1pm 53
2pm 54
3pm 43
4pm 20
5pm 8
6pm 4
7pm 17
8pm 9
9pm 12
11pm 6
SELECT DATE_FORMAT(task1.time, "%l%p") hour,
COUNT(task2.Activity_ID__Case_Safe_) AS calls
YOUR REST OF THE QUERY
GROUP BY 1
ORDER BY hour
1) You can replace the case statement with 1)您可以将case语句替换为
DATE_FORMAT(task1.time, "%l%p") ---This gives hour in AM/PM
And also order by alias rather than writing the logic in order by 而且也要按别名排序,而不是按
2) In your query there is a condition in the outer query , (subquery.account_id__CaseSafe_ IS NULL)
2)在您的查询中,外部查询中有一个条件,
(subquery.account_id__CaseSafe_ IS NULL)
But case safe is not null for the time 12 AM in the sample data. 但是在示例数据中,对于上午12点的时间,案例安全性不为null。 So it is getting filtered out.
因此,它已被过滤掉。
3) If you want to change time across timezone then use 3)如果您想更改时区的时间,请使用
if name = "Johnny Smith",
DATE_FORMAT(date_add(task1.time, INTERVAL 3 HOUR) + 3, "%l%p") ,
DATE_FORMAT(task1.time + 3, "%l%p"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.