Sql 如何根据条件对数据进行分组?

Sql 如何根据条件对数据进行分组?,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,我正在尝试使用sql转换当前表 customer.id sale_date 15 1/12/2017 15 2/12/2017 15 7/12/2017 12 6/09/2017 12 12/09/2017 16 8/14/2017 13 6/01/2017 13 7/01/2017 像这样的事情 sale_date1是第一个订单日期

我正在尝试使用sql转换当前表

customer.id sale_date 
15           1/12/2017
15           2/12/2017
15           7/12/2017
12           6/09/2017
12           12/09/2017
16           8/14/2017
13           6/01/2017
13           7/01/2017
像这样的事情

sale_date1是第一个订单日期

销售日期2是指销售日期1后一个月的任何订单日期

销售日期3是指销售日期1后五个月的任何订单日期


尝试下面使用行数和条件聚合

select customerid,max(case when seq=1 then sale_date end) as date1, 
max(case when seq=2 then sale_date end) as date2,
max(case when seq=3 then sale_date end) as date3
from
(
select *, row_number() over(partition by customerid order by sale_date) as seq
from tablename
)X
group by customerid

这里的一个选项是使用相关子查询填充三列中的每一列:

WITH cte AS (
    SELECT [customer.id], MIN(sale_date) AS min_sale_date 
    FROM yourTable
    GROUP BY [customer.id]
)

SELECT
    [customer.id],
    min_sale_date AS sale_date1,
    (SELECT MIN(t2.sale_date) FROM yourTable t2
     WHERE t1.[customer.id] = t2.[customer.id] AND
           t2.sale_date >= DATEADD(month, 1, t1.min_sale_date) AND
           t2.sale_date <  DATEADD(month, 5, t1.min_sale_date)) AS sale_date2,
    (SELECT MIN(t2.sale_date) FROM yourTable t2
     WHERE t1.[customer.id] = t2.[customer.id] AND
           t2.sale_date >= DATEADD(month, 5, t1.min_sale_date)) AS sale_date3
FROM cte t1
ORDER BY [customer.id];

我想这就是你想要的

SELECT A.customer.id, SALES1.sale_date , SALES2.sale_date ,SALES3.sale_date , SALES4.sale_date,SALES5.sale_date  from 
(SELECT distinct customer.id , 
From yourTable)A 
LEFT JOIN
(SELECT * from 
(SELECT customer.id, sale_date 
  ROW_NUMBER() OVER(ORDER BY sale_date ASC) 
    AS R1,
  name, recovery_model_desc
FROM yourTable)S1 where R1=1)SALES1 
A.customer.id =  SALES1.customer.id
LEFT JOIN
(SELECT * from 
(SELECT customer.id, sale_date 
  ROW_NUMBER() OVER(ORDER BY sale_date ASC) 
    AS R1,
  name, recovery_model_desc
FROM yourTable)S1 where R1=2)SALES2 
A.customer.id =  SALES1.customer.id
LEFT JOIN
(SELECT * from 
(SELECT customer.id, sale_date 
  ROW_NUMBER() OVER(ORDER BY sale_date ASC) 
    AS R1,
  name, recovery_model_desc
FROM yourTable)S1 where R1=3)SALES3 
A.customer.id =  SALES1.customer.id
LEFT JOIN
(SELECT * from 
(SELECT customer.id, sale_date 
  ROW_NUMBER() OVER(ORDER BY sale_date ASC) 
    AS R1,
  name, recovery_model_desc
FROM yourTable)S1 where R1=2)SALES2 
A.customer.id =  SALES1.customer.id
LEFT JOIN
(SELECT * from 
(SELECT customer.id, sale_date 
  ROW_NUMBER() OVER(ORDER BY sale_date ASC) 
    AS R1,
  name, recovery_model_desc
FROM yourTable)S1 where R1=4)SALES4 
A.customer.id =  SALES1.customer.id
LEFT JOIN
(SELECT * from 
(SELECT customer.id, sale_date 
  ROW_NUMBER() OVER(ORDER BY sale_date ASC) 
    AS R1,
  name, recovery_model_desc
FROM yourTable)S1 where R1=2)SALES2 
A.customer.id =  SALES1.customer.id
LEFT JOIN
(SELECT * from 
(SELECT customer.id, sale_date 
  ROW_NUMBER() OVER(ORDER BY sale_date ASC) 
    AS R1,
  name, recovery_model_desc
FROM yourTable)S1 where R1=5)SALES5 
A.customer.id =  SALES1.customer.id
试试这个:

with mindate as (
select id, min(sale_date) MinDate, 
DATEADD(month, 1, min(sale_date)) MinDatePlus1Month, 
DATEADD(month, 5, min(sale_date)) MinDatePlus2Month 
from yourtable
group by id
)
select f1.id, f1.MinDate sale_date1, f2.sale_date sale_date2, f3.sale_date sale_date3 
from mindate f1
left outer join yourtable f2 on f1.id=f2.id and f1.MinDatePlus1Month=f2.sale_date
left outer join yourtable f3 on f1.id=f3.id and f1.MinDatePlus2Month=f3.sale_date

您的dbms名称是什么?一个销售日期可以进行多少次销售?可以有3个以上吗?欢迎光临。请共享您尝试的代码。dbms名称为orders,每天只能进行一次销售,而不是数据库名称、服务器软件名称。Postgres、MySQL、SQL Server等?这是如何满足一个月和五个月的需求的?@TimBiegeleisen,从他的输入表中可以看出customerid的销售日期只是递增的,但我认为这可能只是巧合。我同意这个问题并不完全清楚。你是对的。不管怎么说,出现混淆是因为我们需要查询原始表,但我们还需要每个客户在查询时的最早日期。
with mindate as (
select id, min(sale_date) MinDate, 
DATEADD(month, 1, min(sale_date)) MinDatePlus1Month, 
DATEADD(month, 5, min(sale_date)) MinDatePlus2Month 
from yourtable
group by id
)
select f1.id, f1.MinDate sale_date1, f2.sale_date sale_date2, f3.sale_date sale_date3 
from mindate f1
left outer join yourtable f2 on f1.id=f2.id and f1.MinDatePlus1Month=f2.sale_date
left outer join yourtable f3 on f1.id=f3.id and f1.MinDatePlus2Month=f3.sale_date