2017-07-19 28 views
0

我遇到了问题。按结果集在第一行中选择空值的行集合

我有一些数据很喜欢这些:

 
Id Creation date  Creation date hour range Id vehicule Id variable Value 
1 2017-03-01 9:10  2017-03-01 9:00    1   6   0.18 
2 2017-03-01 9:50  2017-03-01 9:00    1   3   0.50 
3 2017-03-01 9:27  2017-03-01 9:00    1   3   null 
4 2017-03-01 10:05 2017-03-01 10:00   1   3   0.35 
5 2017-03-01 10:17 2017-03-01 10:00   1   3   0.12 
6 2017-03-01 9:05  2017-03-01 9:00    1   5   0.04 
7 2017-03-01 9:57  2017-03-01 9:00    1   5   null 

我需要按组凭身份证驱动车辆,id变量,创建日期,其中选择由标识驱动车辆,id变量,创建日期时间范围和订单行集集团第一个值为空,但第二个值,第三个值,...不为空。因此,在上面的示例中,以下行集:

 
Id Creation date  Creation date hour range Id vehicule Id variable Value 
3 2017-03-01 9:27  2017-03-01 9:00    1   3   null 
2 2017-03-01 9:50  2017-03-01 9:00    1   3   0.50 

请问您能帮我吗?

谢谢

回答

1

在这种情况下,你将没有运气。我想给2“是否存在”到where子句来筛选适合自己的标准的所有ID:

(例如/没有测试/大概需要永远)

select * 
from yourTable y1 
where id in 

--the id must be in all IDs, where the first value of the set is null 

--same ID instead of group by 
(select 1 from yourTable y2 where y1.IDs = y2.IDs and 
--the first in the set 
y2.createdate = (select min(createdate) from yourtable y3 with sameid) and 
y2.value is null) 

AND 

--the id must also be in the IDs, where there are values besides the first that are not null 

id in (same select but with "not min" and "not null" obviously 

希望帮助:)

0

将值字段包含在ORDER BY子句中,它将排序到顶部,因为NULL的实际值比非NULL值低。

假设(因为你的中间段是很难理解),你想要的所有字段的输出,但你想要的第四和第五列在每个组的顶部产生输出的一些分组,以及值= NULL:

SELECT Id, CreatedDate, CreatedDateHourRange, IdVehicule, IdVariable, Value 
ORDER BY IdVehicule, IdVariable, Value 

我看不到任何需要实际的GROUP BY子句。

我认为目前还不清楚是否要将每个块中的NULL值行限制为只有一行NULL,但是如果您确实需要说明日期时间列的排序顺序。

0

事实上,在这里没有用。另外我不确定你的10:00记录会在哪里。这有帮助吗?

;WITH CTE_ADD_SOME_LOGIC 
AS 
(
SELECT Id, CreationDate   ,CreationDateHourRange  ,IdVehicle  ,IdVariable ,Value 
, CASE WHEN Value IS NULL THEN 1 ELSE 0 END AS VALUE_IS_NULL FROM tbl 

), 
CTE_MORE_LOGIC 
AS 
(
SELECT Id, CreationDate   ,CreationDateHourRange  ,IdVehicle  ,IdVariable ,Value,VALUE_IS_NULL 
, RANK() OVER (ORDER BY CreationDateHourRange,VALUE_IS_NULL) AS RN FROM CTE_ADD_SOME_LOGIC), 
CTE_ORDER 
AS 
(
SELECT Id, CreationDate   ,CreationDateHourRange  ,IdVehicle  ,IdVariable ,Value,VALUE_IS_NULL, RN 
, ROW_NUMBER() OVER(PARTITION BY RN ORDER BY RN,IdVehicle,IdVariable,CreationDate, VALUE_IS_NULL DESC) AS HIERARCHY FROM CTE_MORE_LOGIC 
) 

SELECT Id, CreationDate   ,CreationDateHourRange  ,IdVehicle  ,IdVariable ,Value FROM CTE_ORDER WHERE HIERARCHY = 1 
ORDER BY Id 
0

尝试此查询

DECLARE @Nulloccurrence INT=1 -- Give like 1,2,3 value to get first null occurrence 2 for 2nd null occurrence 

SELECT TOP 2 * 
FROM cte 
WHERE Id <= (
SELECT ID FROM 
(
     SELECT Id, ROW_NUMBER()OVER(Order by id) AS Seq 
     FROM cte 
     WHERE (
       CASE 
        WHEN CAST(variableValue AS VARCHAR) IS NULL 
         THEN 'P' 
        ELSE CAST(variableValue AS VARCHAR) 
        END 
       ) = 'P' 
       )Dt 
       WHERE [email protected] 
     ) 
ORDER BY 1 DESC 

预期结果

Id Creationdate Creationdatehourrange Ids vehicleId variableValue 
------------------------------------------------------------------------ 
3 2017-03-01 9:27 2017-03-01 9:00   1  3   NULL 
2 2017-03-01 9:50 2017-03-01 9:00   1  3   0.50 
0

对于“其中第一个值是零,但第二值,第三值,......不为空,”我想您想过滤在您分组的集合中[Value] 处有空值和非空值的情况,以决定是否过滤该分组行。这不能在标准的WHERE子句中被过滤,因为在WHERE子句中,每一行都仅用与该行范围相关的条件进行过滤。简而言之,除非您使用子查询,否则每行过滤都无法“查看”其他行。您需要使用HAVING子句(注释输出为2+空记录) 这将工作:

> DECLARE @mytbl TABLE(Id INT, [Creation date] DATETIME, [Creation date 
> hour range] DATETIME, [Id veh] INT, [Id var] INT, Value INT) 
> 
> INSERT INTO @mytbl VALUES (1,'2017-03-01 9:10 ','2017-03-01 9:00 ',1, 
> 6, 0.18) INSERT INTO @mytbl VALUES (2,'2017-03-01 9:50 ','2017-03-01 
> 9:00 ',1, 3, 0.50) INSERT INTO @mytbl VALUES (3,'2017-03-01 9:27 
> ','2017-03-01 9:00 ',1, 3, NULL) INSERT INTO @mytbl VALUES 
> (4,'2017-03-01 10:05','2017-03-01 10:00',1, 3, 0.35) INSERT INTO 
> @mytbl VALUES (5,'2017-03-01 10:17','2017-03-01 10:00',1, 3, 0.12) 
> INSERT INTO @mytbl VALUES (6,'2017-03-01 9:05 ','2017-03-01 9:00 ',1, 
> 5, 0.04) INSERT INTO @mytbl VALUES (7,'2017-03-01 9:57 ','2017-03-01 
> 9:00 ',1, 5, NULL) 
> 
> SELECT [Id veh], [Id var],[Creation date hour range] FROM @mytbl GROUP 
> BY [Id veh], [Id var],[Creation date hour range] HAVING COUNT([Id 
> veh]) - COUNT(Value) = 1 
> --HAVING COUNT([Id veh]) - COUNT(Value) >= 1 ORDER BY [Id veh], [Id var],[Creation date hour range] 
相关问题