2017-07-19 29 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] 
相關問題