T-SQL每天两个日期之间的最大日期和最小日期

T-SQL每天两个日期之间的最大日期和最小日期,sql,sql-server,tsql,Sql,Sql Server,Tsql,首先,感谢您的时间和帮助 我有两张桌子: 表1 PersId name lastName city --------------------------------------- 1 John Smith Tirana 2 Leri Nice Tirana 3 Adam fortsan Tirana 表2 Id PersId sal

首先,感谢您的时间和帮助

我有两张桌子:

表1

PersId     name       lastName   city
---------------------------------------
1          John       Smith      Tirana
2          Leri       Nice       Tirana
3          Adam       fortsan    Tirana
表2

Id       PersId      salesDate
--------------------------------------------
1         1          2017-01-22 08:00:40 000
2         2          2017-01-22 09:00:00 000
3         1          2017-01-22 10:00:00 000
4         1          2017-01-22 20:00:00 000
5         3          2017-01-15 09:00:00 000
6         1          2017-01-21 09:00:00 000
7         1          2017-01-21 10:00:00 000
8         1          2017-01-21 18:55:00 000
我希望看到最近两个日期之间的第一次销售,根据每个城市的每天如果没有销售,我希望将其清空

 SalesDate > '2017-01-17 09:00:00 000' 
 and SalesDate < '2017-01-23 09:00:00 000'
vb

它工作1天,但不每天工作2天

 SELECT 
        T2.Id, T1.PersId, T2.MIN_salesDate, T2.MAX_salesDate, T1.City
    FROM Table1 T1
    LEFT JOIN
    (
        SELECT MIN(Id) as Id, PersId, MIN(salesDate) as MIN_salesDate, MAX(salesDate) as MAX_salesDate 
        FROM
        (
            SELECT 
                 *
                ,ROW_NUMBER() OVER (PARTITION BY PersId ORDER BY salesDate ASC) as RNKMIN
                ,ROW_NUMBER() OVER (PARTITION BY PersId ORDER BY salesDate DESC) as RNKMAX 
            FROM Table2 T2 
            WHERE salesDate Between '2017-01-17 09:00:00 000' And '2017-01-23 09:00:00 000'
        ) temp
        WHERE RNKMIN = 1 or RNKMAX = 1
        GROUP BY PersId
    ) T2
    on T1.PersId = T2.PersId

请尝试此操作-如果您需要任何修改,请告知我们

SELECT a.PersId, MIN(salesDate) MinSalesDate , CASE WHEN  MIN(salesDate) = MAX(salesDate) 
THEN NULL ELSE MAX(salesDate)  END MaxSalesDate , a.city FROM Table1 a
FULL JOIN Table2 b ON a.PersId = b.PersId
AND SalesDate > '2017-01-17 09:00:00' and SalesDate < '2017-01-23 09:00:00'
WHERE a.PersId IS NOT NULL
GROUP BY a.PersId,a.city,CAST(salesDate AS DATE)
ORDER BY a.PersId
我也更新了您的查询。请参阅。

SELECT 
        T2.Id, T1.PersId, T2.MIN_salesDate, T2.MAX_salesDate, T1.City
    FROM Table1 T1
    LEFT JOIN
    (
        SELECT MIN(Id) as Id, PersId, MIN(salesDate) as MIN_salesDate, MAX(salesDate) as MAX_salesDate 
        FROM
        (
            SELECT 
                 *
                ,ROW_NUMBER() OVER (PARTITION BY PersId ORDER BY salesDate ASC) as RNKMIN
                ,ROW_NUMBER() OVER (PARTITION BY PersId ORDER BY salesDate DESC) as RNKMAX 
            FROM Table2 T2 
            WHERE salesDate Between '2017-01-17 09:00:00' And '2017-01-23 09:00:00'
        ) temp
        WHERE RNKMIN = 1 or RNKMAX = 1
        GROUP BY PersId,CAST(salesDate AS DATE)
    ) T2
    on T1.PersId = T2.PersId
查询的输出

Id          PersId      MIN_salesDate           MAX_salesDate           City
----------- ----------- ----------------------- ----------------------- ----------
6           1           2017-01-21 09:00:00.000 2017-01-21 09:00:00.000 Tirana
4           1           2017-01-22 20:00:00.000 2017-01-22 20:00:00.000 Tirana
2           2           2017-01-22 09:00:00.000 2017-01-22 09:00:00.000 Tirana
NULL        3           NULL                    NULL                    Tirana

(4 rows affected)
试试这个

DECLARE @Table1 TABLE(
PersId INT,
name NVARCHAR(50),
city NVARCHAR(50)
)

DECLARE @Table2 TABLE(
Id INT,
PersId INT,
salesDate NVARCHAR(50)
)

INSERT INTO @Table1 VALUES(1, 'John', 'Tirana')
INSERT INTO @Table1 VALUES(2, 'Leri', 'Tirana')
INSERT INTO @Table1 VALUES(3, 'Adam', 'Tirana')

INSERT INTO @Table2 VALUES(1, 1, '2017-01-22 08:00:40')
INSERT INTO @Table2 VALUES(2, 2, '2017-01-22 09:00:00')
INSERT INTO @Table2 VALUES(3, 1, '2017-01-22 10:00:00')
INSERT INTO @Table2 VALUES(4, 1, '2017-01-22 20:00:00')
INSERT INTO @Table2 VALUES(5, 3, '2017-01-15 09:00:00')
INSERT INTO @Table2 VALUES(6, 1, '2017-01-21 09:00:00')
INSERT INTO @Table2 VALUES(7, 1, '2017-01-21 10:00:00')
INSERT INTO @Table2 VALUES(8, 1, '2017-01-21 18:55:00')



SELECT T1.PersId, GroupTable.MinSalesDate, GroupTable.MaxSalesDate, T1.city
FROM @Table1 AS T1
LEFT JOIN
(SELECT max(salesDate) as 'MaxSalesDate', CASE WHEN min(salesDate) <> max(salesDate) THEN min(salesDate) ELSE NULL END AS 'MinSalesDate', PersId
FROM @Table2
WHERE salesDate > '2017-01-17 09:00:00' and SalesDate < '2017-01-23 09:00:00'
GROUP BY DATEPART(day, salesDate) , PersId) AS GroupTable
ON T1.PersId = GroupTable.PersId
DECLARE@Table1表(
佩西·因特,
名称NVARCHAR(50),
内瓦查市(50)
)
声明@Table2表(
Id INT,
佩西·因特,
销售日期NVARCHAR(50)
)
在@Table1值中插入(1,'John','Tirana')
在@Table1值中插入(2,'Leri','Tirana')
在@Table1值中插入(3,‘亚当’、‘地拉那’)
插入@Table2值(1,1,'2017-01-22 08:00:40')
插入@Table2值(2,2,'2017-01-22 09:00:00')
插入@Table2值(3,1,'2017-01-22 10:00:00')
插入@Table2值(4,1,'2017-01-22 20:00:00')
插入@Table2值(5,3,'2017-01-15 09:00:00')
插入@Table2值(6,1,'2017-01-21 09:00:00')
插入@Table2值(7,1,'2017-01-21 10:00:00')
插入@Table2值(8,1,'2017-01-21 18:55:00')
选择T1.PersId、GroupTable.MinSalesDate、GroupTable.MaxSalesDate、T1.city
从@Table1开始为T1
左连接
(选择max(salesDate)作为“MaxSalesDate”,当min(salesDate)max(salesDate)然后min(salesDate)为空时,则选择max(salesDate)作为“MaxSalesDate”,PersId
来自@Table2
其中salesDate>'2017-01-17 09:00:00'和salesDate<'2017-01-23 09:00:00'
按日期部分(日期、销售日期)分组,PersId)作为GroupTable
关于T1.PersId=GroupTable.PersId
结果:

您的预期输出中的
id
列是什么?表2 id列您不是三天前才问这个问题的吗?但是,您是如何获取多个销售行并进行一个聚合的,所以您想要
t2.id
的MIN()?另外,无论我选择什么,示例输入与示例输出都不匹配。例如,Person3没有在输出中给出id=3的行。在负债前3天,在1天内,我希望看到每天的最小和最大销售额。每天都有,但有一个问题。1人有1天记录1天无记录日不为空。你能查一下吗?没有。你能显示你没有得到的数据吗?示例?我想要最大值和最小值​​在不可记录的天数内为空。我正在添加输出结果upi正在添加结果upOP还需要输出中的
Id
列我想要最大值和最小值​​在不可记录的天数内为空。我正在将输出结果相加——
Id          PersId      MIN_salesDate           MAX_salesDate           City
----------- ----------- ----------------------- ----------------------- ----------
6           1           2017-01-21 09:00:00.000 2017-01-21 09:00:00.000 Tirana
4           1           2017-01-22 20:00:00.000 2017-01-22 20:00:00.000 Tirana
2           2           2017-01-22 09:00:00.000 2017-01-22 09:00:00.000 Tirana
NULL        3           NULL                    NULL                    Tirana

(4 rows affected)
DECLARE @Table1 TABLE(
PersId INT,
name NVARCHAR(50),
city NVARCHAR(50)
)

DECLARE @Table2 TABLE(
Id INT,
PersId INT,
salesDate NVARCHAR(50)
)

INSERT INTO @Table1 VALUES(1, 'John', 'Tirana')
INSERT INTO @Table1 VALUES(2, 'Leri', 'Tirana')
INSERT INTO @Table1 VALUES(3, 'Adam', 'Tirana')

INSERT INTO @Table2 VALUES(1, 1, '2017-01-22 08:00:40')
INSERT INTO @Table2 VALUES(2, 2, '2017-01-22 09:00:00')
INSERT INTO @Table2 VALUES(3, 1, '2017-01-22 10:00:00')
INSERT INTO @Table2 VALUES(4, 1, '2017-01-22 20:00:00')
INSERT INTO @Table2 VALUES(5, 3, '2017-01-15 09:00:00')
INSERT INTO @Table2 VALUES(6, 1, '2017-01-21 09:00:00')
INSERT INTO @Table2 VALUES(7, 1, '2017-01-21 10:00:00')
INSERT INTO @Table2 VALUES(8, 1, '2017-01-21 18:55:00')



SELECT T1.PersId, GroupTable.MinSalesDate, GroupTable.MaxSalesDate, T1.city
FROM @Table1 AS T1
LEFT JOIN
(SELECT max(salesDate) as 'MaxSalesDate', CASE WHEN min(salesDate) <> max(salesDate) THEN min(salesDate) ELSE NULL END AS 'MinSalesDate', PersId
FROM @Table2
WHERE salesDate > '2017-01-17 09:00:00' and SalesDate < '2017-01-23 09:00:00'
GROUP BY DATEPART(day, salesDate) , PersId) AS GroupTable
ON T1.PersId = GroupTable.PersId