SQL 获取前注字段的枢轴函数
SQL Pivot function to obtain top notes field
请查看此问题以获得更多上下文:我使用下面的代码使用数据透视函数创建了一个信息列表
WITH List AS
(
SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime UNION ALL
SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime UNION ALL
SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime UNION ALL
SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime UNION ALL
SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime UNION ALL
SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime UNION ALL
SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime
)
SELECT Company, Call, Meeting, Email
FROM
(
SELECT StartTime, ContactType, Company
FROM List
) L
PIVOT
(
MAX(StartTime)
FOR ContactType IN (Call, Meeting, Email)
) CT
这有助于产生 table 结果:
+---------+------------+------------+------------+
| Company | Call | Meeting | Email |
+---------+------------+------------+------------+
| x | 02/01/2016 | 02/01/2016 | 03/01/2016 |
| y | 02/02/2016 | 01/01/2016 | 01/02/2016 |
| z | 24/01/2016 | 10/01/2016 | Null |
+---------+------------+------------+------------+
我想通过将附加列合并到我的原始查询中来进一步解决这个问题。我想像这样在查询中添加注释:
WITH List AS
(
SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL
SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL
SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL
SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL
SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL
SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL
SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note
)
我想要生成的 table 输出是:
+---------+------------+------------+------------+------------+
| Company | Call | Meeting | Email | Note |
+---------+------------+------------+------------+------------+
| x | 02/01/2016 | 02/01/2016 | 03/01/2016 | blablabla4 |
| y | 02/02/2016 | 01/01/2016 | 01/02/2016 | blablabla7 |
| z | 24/01/2016 | 10/01/2016 | Null | blablabla9 |
+---------+------------+------------+------------+------------+
现在是棘手的一点。我希望根据联系方式选择的笔记是最新的笔记。在第一行注释中:blablabla4 被选中,因为最近的联系是通过电子邮件“03/01/2016”进行的,因此它选择了这条注释。
有没有人知道我如何在不使用子查询我自己的数据的情况下实现这一目标。
使用Conditional Aggregate
代替主元
WITH List AS
(
SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL
SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL
SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL
SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL
SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL
SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL
SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note
)
SELECT Company,
call = Max(CASE WHEN ContactType = 'call' THEN StartTime END),
Meeting = Max(CASE WHEN ContactType = 'Meeting' THEN StartTime END),
Email = Max(CASE WHEN ContactType = 'Email' THEN StartTime END),
Note
FROM (SELECT Company,
ContactType,
StartTime,
First_value(Note)OVER(partition BY Company ORDER BY StartTime DESC) AS Note
FROM list) a
GROUP BY Company,note
您可以使用 ROW_NUMBER() 获取最新的笔记
WITH List AS
(
SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL
SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL
SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL
SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL
SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL
SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL
SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note
)
Select Company
,Call = max(case when ContactType='Call' then StartTime end)
,Meeting = max(case when ContactType='Meeting' then StartTime end)
,Email = max(case when ContactType='Email' then StartTime end)
,Note = max(case when ContactType<>'Email' and RN=1 then Note end)
From (
Select *
,RN = Row_Number() over (Partition By Company,case when ContactType <>'EMail' then 1 else 0 end Order By StartTime Desc)
from List
) A
Group BY Company
Returns
Company Call Meeting Email Note
x 02/01/2016 02/01/2016 03/01/2016 blablabla3
y 02/02/2016 01/01/2016 01/02/2016 blablabla7
z 24/01/2016 10/01/2016 NULL blablabla9
请查看此问题以获得更多上下文:
WITH List AS
(
SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime UNION ALL
SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime UNION ALL
SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime UNION ALL
SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime UNION ALL
SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime UNION ALL
SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime UNION ALL
SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime
)
SELECT Company, Call, Meeting, Email
FROM
(
SELECT StartTime, ContactType, Company
FROM List
) L
PIVOT
(
MAX(StartTime)
FOR ContactType IN (Call, Meeting, Email)
) CT
这有助于产生 table 结果:
+---------+------------+------------+------------+
| Company | Call | Meeting | Email |
+---------+------------+------------+------------+
| x | 02/01/2016 | 02/01/2016 | 03/01/2016 |
| y | 02/02/2016 | 01/01/2016 | 01/02/2016 |
| z | 24/01/2016 | 10/01/2016 | Null |
+---------+------------+------------+------------+
我想通过将附加列合并到我的原始查询中来进一步解决这个问题。我想像这样在查询中添加注释:
WITH List AS
(
SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL
SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL
SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL
SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL
SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL
SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL
SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note
)
我想要生成的 table 输出是:
+---------+------------+------------+------------+------------+
| Company | Call | Meeting | Email | Note |
+---------+------------+------------+------------+------------+
| x | 02/01/2016 | 02/01/2016 | 03/01/2016 | blablabla4 |
| y | 02/02/2016 | 01/01/2016 | 01/02/2016 | blablabla7 |
| z | 24/01/2016 | 10/01/2016 | Null | blablabla9 |
+---------+------------+------------+------------+------------+
现在是棘手的一点。我希望根据联系方式选择的笔记是最新的笔记。在第一行注释中:blablabla4 被选中,因为最近的联系是通过电子邮件“03/01/2016”进行的,因此它选择了这条注释。
有没有人知道我如何在不使用子查询我自己的数据的情况下实现这一目标。
使用Conditional Aggregate
代替主元
WITH List AS
(
SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL
SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL
SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL
SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL
SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL
SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL
SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note
)
SELECT Company,
call = Max(CASE WHEN ContactType = 'call' THEN StartTime END),
Meeting = Max(CASE WHEN ContactType = 'Meeting' THEN StartTime END),
Email = Max(CASE WHEN ContactType = 'Email' THEN StartTime END),
Note
FROM (SELECT Company,
ContactType,
StartTime,
First_value(Note)OVER(partition BY Company ORDER BY StartTime DESC) AS Note
FROM list) a
GROUP BY Company,note
您可以使用 ROW_NUMBER() 获取最新的笔记
WITH List AS
(
SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL
SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL
SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL
SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL
SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL
SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL
SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL
SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL
SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note
)
Select Company
,Call = max(case when ContactType='Call' then StartTime end)
,Meeting = max(case when ContactType='Meeting' then StartTime end)
,Email = max(case when ContactType='Email' then StartTime end)
,Note = max(case when ContactType<>'Email' and RN=1 then Note end)
From (
Select *
,RN = Row_Number() over (Partition By Company,case when ContactType <>'EMail' then 1 else 0 end Order By StartTime Desc)
from List
) A
Group BY Company
Returns
Company Call Meeting Email Note
x 02/01/2016 02/01/2016 03/01/2016 blablabla3
y 02/02/2016 01/01/2016 01/02/2016 blablabla7
z 24/01/2016 10/01/2016 NULL blablabla9