在SQLServer2008中使用日期函数进行计算
我正在尝试为一组在SQLServer2008中使用日期函数进行计算,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试为一组BINGID,INDUSID,COMP1计算to\u DATE列 当IsRowActive=1时,则TO_DATE=“9999-12-31”将被正确返回 但是当IsRowActive=0时,我们必须从dt 数据: DECLARE @MYTABLE TABLE ( BINGID INT, INDUSID INT, DTSEARCH DATETIME2, COMP1 VARCHAR (100), LISTPRICE NUMERIC(10,2), FROMDT DATETIM
BINGID
,INDUSID
,COMP1
计算to\u DATE
列
当IsRowActive=1
时,则TO_DATE
=“9999-12-31”将被正确返回
但是当IsRowActive=0
时,我们必须从dt
数据:
DECLARE @MYTABLE TABLE
(
BINGID INT,
INDUSID INT,
DTSEARCH DATETIME2,
COMP1 VARCHAR (100),
LISTPRICE NUMERIC(10,2),
FROMDT DATETIME2,
IsRowActive INT
)
INSERT @MYTABLE
SELECT 1002285, 1002, '2016-03-03 04:10:58.0000000', '0026PU009163-031', '77.7600', '2015-12-19 12:51:49.0000000',0 UNION ALL
SELECT 1002285, 1002, '2016-05-27 12:14:53.0000000', '0026PU009163-031', '85.2200', '2016-05-27 12:14:53.0000000',0 UNION ALL
SELECT 1002285, 1002, '2016-07-20 06:44:37.0000000', '0026PU009163-031', '90.3900', '2016-07-20 06:44:37.0000000',0 UNION ALL
SELECT 1002285, 1002, '2016-11-09 13:37:13.0000000', '0026PU009163-031', '131.4500', '2016-10-18 13:49:10.0000000',1 UNION ALL
SELECT 1002285, 1002, '2015-12-19 12:51:41.0000000', '10122374', 65.1400, '2015-12-19 12:51:41.0000000', 0 UNION ALL
SELECT 1002285, 1002, '2016-03-03 04:11:01.0000000', '10122374', 117.2100, '2016-03-03 04:11:01.0000000', 0 UNION ALL
SELECT 1002285, 1002, '2016-05-27 12:14:45.0000000', '10122374', 53.5500, '2016-05-27 12:14:45.0000000', 0 UNION ALL
SELECT 1002285, 1002, '2016-07-20 06:44:29.0000000', '10122374', 48.5000, '2016-07-20 06:44:29.0000000', 0 UNION ALL
SELECT 1002285, 1002, '2016-10-18 13:49:00.0000000', '10122374', 75.6800, '2016-10-18 13:49:00.0000000', 0 UNION ALL
SELECT 1002285, 1002, '2016-11-09 13:37:02.0000000', '10122374', 68.2400, '2016-11-09 13:37:02.0000000', 1 UNION ALL
SELECT 1000001, 1002, '2016-03-03 02:22:09.0000000', '161GDB1577', 37.1700, '2015-12-18 06:45:05.0000000',0 UNION ALL
SELECT 1000001, 1002, '2016-03-03 02:22:18.0000000', '0392347402', 41.9100, '2015-12-18 06:45:14.0000000',0 UNION ALL
SELECT 1000001, 1002, '2016-05-26 14:54:28.0000000', '161GDB1577', 46.7100, '2016-05-26 14:54:28.0000000',0 UNION ALL
SELECT 1000001, 1002, '2016-05-26 14:54:42.0000000', '0392347402', 54.7100, '2016-05-26 14:54:42.0000000',0 UNION ALL
SELECT 1000001, 1002, '2016-07-15 06:34:33.0000000', '161GDB1577', 52.4800, '2016-07-15 06:34:33.0000000',0 UNION ALL
SELECT 1000001, 1002, '2016-07-15 06:34:45.0000000', '0392347402', 81.7100, '2016-07-15 06:34:45.0000000',0 UNION ALL
SELECT 1000001, 1002, '2016-10-17 11:26:45.0000000', '161GDB1577', 61.6400, '2016-10-17 11:26:45.0000000',0 UNION ALL
SELECT 1000001, 1002, '2016-11-09 02:21:17.0000000', '0392347402', 81.9200, '2016-10-17 11:26:58.0000000',1 UNION ALL
SELECT 1000001, 1002, '2016-11-09 02:21:05.0000000', '161GDB1577', 78.3500, '2016-11-09 02:21:05.0000000',1 UNION ALL
SELECT 1000005, 1002, '2018-11-09 02:21:05.0000000', '556556GHB', 78.3500, '2018-11-09 02:21:05.0000000',1
我尝试过的查询-不幸的是,它返回了错误的数据:
SELECT
BINGID, INDUSID, DTSEARCH,
COMP1, LISTPRICE, FROMDT,
CASE
WHEN IsRowActive = 1
THEN '9999-12-31'
ELSE TO_DATE
END AS TO_DATE,
IsRowActive
FROM
@MYTABLE mt
OUTER APPLY
(SELECT
MAX(DATEADD(second, -1, FROMDT)) TO_DATE
FROM
@MYTABLE mt2
WHERE
mt2.BINGID = mt.BINGID
AND mt2.INDUSID = mt.INDUSID
AND mt2.FROMDT > mt.FROMDT) oa
WHERE
mt.INDUSID = '1002'
预期产量
BINGID INDUSID DTSEARCH COMP1 LISTPRICE FROMDT NEW_TO_DATE IsRowCurrent
1000001 1002 2016-03-03 02:22:09.0000000 161GDB1577 37.1700 2015-12-18 06:45:05.0000000 2016-05-26 14:54:27.0000000 0
1000001 1002 2016-03-03 02:22:18.0000000 0392347402 41.9100 2015-12-18 06:45:14.0000000 2016-05-26 14:54:41.0000000 0
1000001 1002 2016-05-26 14:54:28.0000000 161GDB1577 46.7100 2016-05-26 14:54:28.0000000 2016-07-15 06:34:32.0000000 0
1000001 1002 2016-05-26 14:54:42.0000000 0392347402 54.7100 2016-05-26 14:54:42.0000000 2016-07-15 06:34:44.0000000 0
1000001 1002 2016-07-15 06:34:33.0000000 161GDB1577 52.4800 2016-07-15 06:34:33.0000000 2016-10-17 11:26:44.0000000 0
1000001 1002 2016-07-15 06:34:45.0000000 0392347402 81.7100 2016-07-15 06:34:45.0000000 2016-10-17 11:26:57.0000000 0
1000001 1002 2016-10-17 11:26:45.0000000 161GDB1577 61.6400 2016-10-17 11:26:45.0000000 2016-11-09 02:21:04.0000000 0
1000001 1002 2016-11-09 02:21:17.0000000 0392347402 81.9200 2016-10-17 11:26:58.0000000 9999-12-31 00:00:00.0000000 1
1000001 1002 2016-11-09 02:21:05.0000000 161GDB1577 78.3500 2016-11-09 02:21:05.0000000 9999-12-31 00:00:00.0000000 1
1000005 1002 2018-11-09 02:21:05.0000000 556556GHB 78.3500 2018-11-09 02:21:05.0000000 9999-12-31 00:00:00.0000000 1
1002285, 1002, '2016-03-03 04:10:58.0000000', '0026PU009163-031', '77.7600', 2015-12-19 12:51:49.0000000' 2016-05-27 12:14:52.0000000' 0
1002285, 1002, '2016-05-27 12:14:53.0000000', '0026PU009163-031', '85.2200', 2016-05-27 12:14:53.0000000' 2016-07-20 06:44:36.0000000' 0
1002285, 1002, '2016-07-20 06:44:37.0000000', '0026PU009163-031', '90.3900', 2016-07-20 06:44:37.0000000' 2016-10-18 13:49:09.0000000' 0
1002285, 1002, '2016-11-09 13:37:13.0000000', '0026PU009163-031', '131.4500', 2016-10-18 13:49:10.0000000' 9999-12-31 00:00:00.0000000 1
1002285, 1002, '2015-12-19 12:51:41.0000000', '10122374', 65.1400, '2015-12-19 12:51:41.0000000', 2016-03-03 04:11:00.0000000', 0
1002285, 1002, '2016-03-03 04:11:01.0000000', '10122374', 117.2100, '2016-03-03 04:11:01.0000000', 2016-05-27 12:14:44.0000000', 0
1002285, 1002, '2016-05-27 12:14:45.0000000', '10122374', 53.5500, '2016-05-27 12:14:45.0000000', 2016-07-20 06:44:28.0000000', 0
1002285, 1002, '2016-07-20 06:44:29.0000000', '10122374', 48.5000, '2016-07-20 06:44:29.0000000', 2016-10-18 13:48:59.0000000', 0
1002285, 1002, '2016-10-18 13:49:00.0000000', '10122374', 75.6800, '2016-10-18 13:49:00.0000000', 2016-11-09 13:37:01.0000000', 0
1002285, 1002, '2016-11-09 13:37:02.0000000', '10122374', 68.2400, '2016-11-09 13:37:02.0000000', 9999-12-31 00:00:00.0000000 1
谢谢
DECLARE @MYTABLE TABLE
(
BINGID int,
INDUSID int,
DTSEARCH datetime2,
COMP1 varchar(100),
LISTPRICE numeric(15,5),
FROMDT datetime2,
IsRowActive int
)
insert @MYTABLE
SELECT 1002285 ,1002 ,'2016-03-03 04:10:58.0000000', '0026PU009163-031', 77.7600 ,'2015-12-19 12:51:49.0000000', 0 UNION ALL
SELECT 1002285 ,1002 ,'2016-05-27 12:14:53.0000000', '0026PU009163-031', 85.2200 ,'2016-05-27 12:14:53.0000000', 0 UNION ALL
SELECT 1002285 ,1002 ,'2016-07-20 06:44:37.0000000', '0026PU009163-031', 90.3900 ,'2016-07-20 06:44:37.0000000', 0 UNION ALL
SELECT 1002285 ,1002 ,'2016-11-09 13:37:13.0000000', '0026PU009163-031', 131.4500,'2016-07-20 06:44:37.0000000', 1
select BINGID,DTSEARCH,COMP1,LISTPRICE,FROMDT,CASE WHEN IsRowActive = 0 THEN lead(DATEADD(SS,-1,FROMDT)) OVER (ORDER BY FROMDT) ELSE '9999-12-31' END AS expected_date
FROM @MYTABLE mt
输出
BINGID DTSEARCH COMP1 LISTPRICE FROMDT expected_date
1002285 2016-03-03 04:10:58.0000000 0026PU009163-031 77.76000 2015-12-19 12:51:49.0000000 2016-05-27 12:14:52.0000000
1002285 2016-05-27 12:14:53.0000000 0026PU009163-031 85.22000 2016-05-27 12:14:53.0000000 2016-07-20 06:44:36.0000000
1002285 2016-07-20 06:44:37.0000000 0026PU009163-031 90.39000 2016-07-20 06:44:37.0000000 2016-07-20 06:44:36.0000000
1002285 2016-11-09 13:37:13.0000000 0026PU009163-031 131.45000 2016-07-20 06:44:37.0000000 9999-12-31 00:00:00.0000000
尝试这个简单易读的解决方案,使用
CTE
和Self-Join
with cte as
(
SELECT
ROW_NUMBER() over (order by BINGID,INDUSID,DTSEARCH,COMP1,LISTPRICE,FROMDT)
as rowno, -- It is good if you have identity column here
BINGID,
INDUSID,
DTSEARCH,
COMP1,
LISTPRICE,
FROMDT,
IsRowActive
FROM @MYTABLE mt
)
select c1.*,
CASE WHEN c1.IsRowActive = 1 THEN '9999-12-31' ELSE DATEADD(second, -1, c2.FROMDT) END
AS TO_DATE
from cte c1 left join cte c2
on c1.rowno+1 = c2.rowno
在
外部应用
中,使用TOP(1)
和适当的顺序,而不是MAX
另外,您说过要按BINGID、INDUSID、COMP1
进行分组,因此请使用外部应用中WHERE
子句中的所有这些列。为什么在查询中省略了COMP1
样本数据
DECLARE @MYTABLE TABLE
(
BINGID INT,
INDUSID INT,
DTSEARCH DATETIME2,
COMP1 VARCHAR (100),
LISTPRICE NUMERIC(10,2),
FROMDT DATETIME2,
IsRowActive INT
)
INSERT INTO @MYTABLE
SELECT 1002285, 1002, '2016-03-03 04:10:58', '0026PU009163-031', 77.7600, '2015-12-19 12:51:49', 0 UNION ALL
SELECT 1002285, 1002, '2016-05-27 12:14:53', '0026PU009163-031', 85.2200, '2016-05-27 12:14:53', 0 UNION ALL
SELECT 1002285, 1002, '2016-07-20 06:44:37', '0026PU009163-031', 90.3900, '2016-07-20 06:44:37', 0 UNION ALL
SELECT 1002285, 1002, '2016-11-09 13:37:13', '0026PU009163-031', 131.4500, '2016-10-18 13:49:10', 1 UNION ALL
SELECT 1002285, 1002, '2015-12-19 12:51:41', '10122374', 65.1400, '2015-12-19 12:51:41', 0 UNION ALL
SELECT 1002285, 1002, '2016-03-03 04:11:01', '10122374', 117.2100, '2016-03-03 04:11:01', 0 UNION ALL
SELECT 1002285, 1002, '2016-05-27 12:14:45', '10122374', 53.5500, '2016-05-27 12:14:45', 0 UNION ALL
SELECT 1002285, 1002, '2016-07-20 06:44:29', '10122374', 48.5000, '2016-07-20 06:44:29', 0 UNION ALL
SELECT 1002285, 1002, '2016-10-18 13:49:00', '10122374', 75.6800, '2016-10-18 13:49:00', 0 UNION ALL
SELECT 1002285, 1002, '2016-11-09 13:37:02', '10122374', 68.2400, '2016-11-09 13:37:02', 1 UNION ALL
SELECT 1000001, 1002, '2016-03-03 02:22:09', '161GDB1577', 37.1700, '2015-12-18 06:45:05', 0 UNION ALL
SELECT 1000001, 1002, '2016-03-03 02:22:18', '0392347402', 41.9100, '2015-12-18 06:45:14', 0 UNION ALL
SELECT 1000001, 1002, '2016-05-26 14:54:28', '161GDB1577', 46.7100, '2016-05-26 14:54:28', 0 UNION ALL
SELECT 1000001, 1002, '2016-05-26 14:54:42', '0392347402', 54.7100, '2016-05-26 14:54:42', 0 UNION ALL
SELECT 1000001, 1002, '2016-07-15 06:34:33', '161GDB1577', 52.4800, '2016-07-15 06:34:33', 0 UNION ALL
SELECT 1000001, 1002, '2016-07-15 06:34:45', '0392347402', 81.7100, '2016-07-15 06:34:45', 0 UNION ALL
SELECT 1000001, 1002, '2016-10-17 11:26:45', '161GDB1577', 61.6400, '2016-10-17 11:26:45', 0 UNION ALL
SELECT 1000001, 1002, '2016-11-09 02:21:17', '0392347402', 81.9200, '2016-10-17 11:26:58', 1 UNION ALL
SELECT 1000001, 1002, '2016-11-09 02:21:05', '161GDB1577', 78.3500, '2016-11-09 02:21:05', 1 UNION ALL
SELECT 1000005, 1002, '2018-11-09 02:21:05', '556556GHB', 78.3500, '2018-11-09 02:21:05', 1
查询
SELECT
BINGID,
INDUSID,
DTSEARCH,
COMP1,
LISTPRICE,
FROMDT,
CASE WHEN IsRowActive = 1 THEN '9999-12-31' ELSE oa.TO_DATE END AS TO_DATE,
IsRowActive
FROM
@MYTABLE AS mt
OUTER APPLY
(
SELECT TOP(1) DATEADD(second, -1, FROMDT) AS TO_DATE
FROM @MYTABLE AS mt2
WHERE
mt2.BINGID = mt.BINGID
AND mt2.INDUSID = mt.INDUSID
AND mt2.COMP1 = mt.COMP1
AND mt2.FROMDT > mt.FROMDT
ORDER BY mt2.FROMDT
) AS oa
WHERE
mt.INDUSID = '1002'
ORDER BY BINGID, INDUSID, COMP1, FROMDT;
结果
+---------+---------+-----------------------------+------------------+-----------+-----------------------------+-----------------------------+-------------+
| BINGID | INDUSID | DTSEARCH | COMP1 | LISTPRICE | FROMDT | TO_DATE | IsRowActive |
+---------+---------+-----------------------------+------------------+-----------+-----------------------------+-----------------------------+-------------+
| 1000001 | 1002 | 2016-03-03 02:22:18.0000000 | 0392347402 | 41.91 | 2015-12-18 06:45:14.0000000 | 2016-05-26 14:54:41.0000000 | 0 |
| 1000001 | 1002 | 2016-05-26 14:54:42.0000000 | 0392347402 | 54.71 | 2016-05-26 14:54:42.0000000 | 2016-07-15 06:34:44.0000000 | 0 |
| 1000001 | 1002 | 2016-07-15 06:34:45.0000000 | 0392347402 | 81.71 | 2016-07-15 06:34:45.0000000 | 2016-10-17 11:26:57.0000000 | 0 |
| 1000001 | 1002 | 2016-11-09 02:21:17.0000000 | 0392347402 | 81.92 | 2016-10-17 11:26:58.0000000 | 9999-12-31 00:00:00.0000000 | 1 |
| 1000001 | 1002 | 2016-03-03 02:22:09.0000000 | 161GDB1577 | 37.17 | 2015-12-18 06:45:05.0000000 | 2016-05-26 14:54:27.0000000 | 0 |
| 1000001 | 1002 | 2016-05-26 14:54:28.0000000 | 161GDB1577 | 46.71 | 2016-05-26 14:54:28.0000000 | 2016-07-15 06:34:32.0000000 | 0 |
| 1000001 | 1002 | 2016-07-15 06:34:33.0000000 | 161GDB1577 | 52.48 | 2016-07-15 06:34:33.0000000 | 2016-10-17 11:26:44.0000000 | 0 |
| 1000001 | 1002 | 2016-10-17 11:26:45.0000000 | 161GDB1577 | 61.64 | 2016-10-17 11:26:45.0000000 | 2016-11-09 02:21:04.0000000 | 0 |
| 1000001 | 1002 | 2016-11-09 02:21:05.0000000 | 161GDB1577 | 78.35 | 2016-11-09 02:21:05.0000000 | 9999-12-31 00:00:00.0000000 | 1 |
| 1000005 | 1002 | 2018-11-09 02:21:05.0000000 | 556556GHB | 78.35 | 2018-11-09 02:21:05.0000000 | 9999-12-31 00:00:00.0000000 | 1 |
| 1002285 | 1002 | 2016-03-03 04:10:58.0000000 | 0026PU009163-031 | 77.76 | 2015-12-19 12:51:49.0000000 | 2016-05-27 12:14:52.0000000 | 0 |
| 1002285 | 1002 | 2016-05-27 12:14:53.0000000 | 0026PU009163-031 | 85.22 | 2016-05-27 12:14:53.0000000 | 2016-07-20 06:44:36.0000000 | 0 |
| 1002285 | 1002 | 2016-07-20 06:44:37.0000000 | 0026PU009163-031 | 90.39 | 2016-07-20 06:44:37.0000000 | 2016-10-18 13:49:09.0000000 | 0 |
| 1002285 | 1002 | 2016-11-09 13:37:13.0000000 | 0026PU009163-031 | 131.45 | 2016-10-18 13:49:10.0000000 | 9999-12-31 00:00:00.0000000 | 1 |
| 1002285 | 1002 | 2015-12-19 12:51:41.0000000 | 10122374 | 65.14 | 2015-12-19 12:51:41.0000000 | 2016-03-03 04:11:00.0000000 | 0 |
| 1002285 | 1002 | 2016-03-03 04:11:01.0000000 | 10122374 | 117.21 | 2016-03-03 04:11:01.0000000 | 2016-05-27 12:14:44.0000000 | 0 |
| 1002285 | 1002 | 2016-05-27 12:14:45.0000000 | 10122374 | 53.55 | 2016-05-27 12:14:45.0000000 | 2016-07-20 06:44:28.0000000 | 0 |
| 1002285 | 1002 | 2016-07-20 06:44:29.0000000 | 10122374 | 48.50 | 2016-07-20 06:44:29.0000000 | 2016-10-18 13:48:59.0000000 | 0 |
| 1002285 | 1002 | 2016-10-18 13:49:00.0000000 | 10122374 | 75.68 | 2016-10-18 13:49:00.0000000 | 2016-11-09 13:37:01.0000000 | 0 |
| 1002285 | 1002 | 2016-11-09 13:37:02.0000000 | 10122374 | 68.24 | 2016-11-09 13:37:02.0000000 | 9999-12-31 00:00:00.0000000 | 1 |
+---------+---------+-----------------------------+------------------+-----------+-----------------------------+-----------------------------+-------------+
我真的很喜欢“Chanukya”的回答。但当您使用2008时,您将无法使用LEAD功能。相反,您可以使用自联接:
-- SQL Server 2008.
SELECT
c.*,
CASE c.IsRowActive
WHEN 1 THEN '9999-12-31'
ELSE DATEADD(SECOND, -1, MIN(p.FROMDT))
END AS TO_DATE
FROM
@MYTABLE AS c
LEFT OUTER JOIN @MYTABLE AS p ON p.BINGID = c.BINGID
AND p.INDUSID = c.INDUSID
AND p.FROMDT > c.FROMDT
GROUP BY
c.BINGID,
c.INDUSID,
c.DTSEARCH,
c.COMP1,
c.LISTPRICE,
c.FROMDT,
c.IsRowActive
ORDER BY
c.FROMDT
;
逻辑类似于外部应用程序,但它的性能应该更好。这是因为没有
样本数据提出了一个小挑战。因为有两条记录的FROMDT
值为2016-07-20 06:44:37.0000000
,你可能会说我的结果是错误的 使用CTE+连接:
最后,解决方案就在这里。
根据您的要求,结果数据最终是准确的,您也可以使用[列名]更改顺序
代码:
with cte as
(
SELECT
ROW_NUMBER( ) OVER ( partition by COMP1 ORDER BY (SELECT 1))
rowno,
BINGID,
INDUSID,
DTSEARCH,
COMP1,
LISTPRICE,
FROMDT,
IsRowActive
FROM @MYTABLE mt
)
select c1.BINGID,c1.INDUSID, c1.DTSEARCH, c1.COMP1, c1.LISTPRICE, c1.FROMDT, c1.IsRowActive,
CASE WHEN c1.IsRowActive = 1 THEN '9999-12-31' ELSE case when ( c2.rowno is null ) THEN '9999-12-31'
else DATEADD(second, -1, coalesce(c2.FROMDT,'9999-12-31') ) End END
AS TO_DATE
from cte c1 left join cte c2
on c1.rowno+1= c2.rowno and c1.COMP1=c2.COMP1
order by c1.BINGID,DTSEARCH
还要检查。顺便说一句:这是一个好问题!复制可粘贴的测试场景、自己的努力、预期结果+我的side@RohiniMathur预期的输出需要任何订单或按其要求。或者我得到了结果,但订购的Sexunce仅未匹配。谢谢,但这并不能给出正确的结果。截止日期应比下一个FMDT短1秒。LEAD
在SQL Server 2008中不可用。我编辑了我的答案,您可以检查一下吗…@RohiniMathurthen按顺序保存什么是正确的…@VladimirBaranovI不太确定在SQL中是否可能。。。。。。。。请有人分享他们的专业知识。谢谢,但我希望在第三个截止日期中的值为“2016-07-20 06:44:36.0000000”,而不是NULL。@RohiniMathur,如果没有“下一行”,请解释应该有什么逻辑。当没有下一行时,它会根据列“IsRowActive=1”进行计算因此,将在FROMDT列上进行计算,其中TO_DATE=9999-12-31 00:00:00。0000000@RohiniMathur,当FROMDT
在两行中具有完全相同的值时,如果希望在to_DATE
中具有某些值,则需要为这些行定义明确的顺序。如果时间戳可能有重复项,那么人们通常会在时间戳之外使用唯一的行ID。你们有这样的身份证吗?目前,没有一行的FROMDT
大于2016-07-20 06:44:37
,因此“下一行”未定义。谢谢。。。。。。。。你完全正确,弗拉基米尔。我正在改变桌子的结构。谢谢你@VladimirBaranov。你说得对,我的尝试太可怕了。更新以修复。喜欢你的答案,写得好。容易跟随。投票。要获得简单的解决方案,请尝试。但结果仍然不匹配。请使用下面注释中列出的另一个示例数据进行检查。按BINGID、INDUSID、DTSEARCH、COMP1、LISTPRICE、FROMDT排序不正确。是的,但是。。查询显示正确的结果。还要提到---如果你有身份栏就好了here@Munavvar,实际上,不是。您的查询不会返回预期结果。这就是为什么要投否决票。提示:最好也有分区。对不起,博萨莱先生。这并没有给出正确的结果。有两个错误,第一:表只有2000条记录,但在输出中它给出了5000条记录,第二:它给出9999-12-31 00:00:00.0000000,即使是IsRowActive='0'我是否可以用预期输出扩展样本数据添加更多样本数据。这意味着COMP1值会发生变化。您希望根据'COMP1'获得单独的结果,并且截止日期必须是受尊重的COMP1组的下一个日期,无论是sRowActive='1'还是'0'。对吗?最后一条记录的“截止日期”应该是什么?博萨尔:你绝对是对的。最后一个截止日期应为9999-12-31。