2

Identity、RecordId、Type、Reading、および IsDeleted 列を持つテーブルがあります。Identity は自動インクリメントの主キー、RecordId は重複値を持つことができる整数、Type は「1」または「平均」の読み取りのタイプ、Reading は任意の整数値を含む整数、IsDeleted はそのビットです。 0 または 1、つまり false または true を指定できます。ここで、各 RecordId の COUNT(Id) が 2 より大きい場合にその RecordId のすべてのレコードを表示するような方法で、テーブルのすべてのレコードを含むクエリが必要です。

その特定の RecordId の COUNT(Id) == 2 と、レコードの「1」タイプまたは「平均」タイプの両方の Reading 値が同じである場合、平均レコードのみを表示します。

COUNT(Id) ==1 の場合、そのレコードのみを表示します。

例えば ​​:

Id          RecordId          Type          Reading       IsDeleted 
1           1                 one             4              0
2           1                 one             5              0
3           1                 one             6              0
4           1                 average         5              0
5           2                 one             1              0
6           2                 one             3              0
7           2                 average         2              0
8           3                 one             2              0
9           3                 average         2              0
10          4                 one             5              0
11          4                 average         6              0
12          5                 one             7              0

答えの結果は

Id          RecordId          Type          Reading       IsDeleted 
1           1                 one             4              0
2           1                 one             5              0
3           1                 one             6              0
4           1                 average         5              0
5           2                 one             1              0
6           2                 one             3              0
7           2                 average         2              0
9           3                 average         2              0
10          4                 one             5              0
11          4                 average         6              0
12          5                 one             7              0

つまり、同じ値の平均読み取り値と、「1」タイプの読み取りのカウントが1を超えない「1」タイプの読み取りをスキップしたいと思います。

4

3 に答える 3

2

このプログラムをチェックしてください

DECLARE @t TABLE(ID INT IDENTITY,RecordId INT,[Type] VARCHAR(10),Reading INT,IsDeleted BIT)
INSERT INTO @t VALUES
(1,'one',4,0),(1,'one',5,0),(1,'one',6,0),(1,'average',5,0),(2,'one',1,0),(2,'one',3,0),
(2,'average',2,0),(3,'one',2,0),(3,'average',2,0),(4,'one',5,0),(4,'average',6,0),(5,'one',7,0),
(6,'average',6,0),(6,'average',6,0),(7,'one',6,0),(7,'one',6,0)
--SELECT * FROM @t

;WITH GetAllRecordsCount AS                              
(   
    SELECT *,Cnt = COUNT(RecordId) OVER(PARTITION BY RecordId ORDER BY RecordId)
    FROM @t
)
-- Condition 1 : When COUNT(RecordId) for each RecordId is greater than 2 
 --               then display all the records of that RecordId. 
, GetRecordsWithCountMoreThan2 AS
(
    SELECT * FROM GetAllRecordsCount WHERE Cnt > 2
)
-- Get all records where count = 2
, GetRecordsWithCountEquals2 AS
(
    SELECT * FROM GetAllRecordsCount WHERE Cnt = 2
)
-- Condition 3 : When COUNT(RecordId) == 1 then display only that record.
, GetRecordsWithCountEquals1 AS
(
    SELECT * FROM GetAllRecordsCount WHERE Cnt = 1
)

-- Condition 1: When COUNT(RecordId) > 2
SELECT * FROM GetRecordsWithCountMoreThan2  UNION ALL

-- Condition 2 : When  COUNT(RecordId) == 2 for that specific RecordId and Reading value of 
--               both i.e. 'one' or 'average' type of the records are same then display only 
--               average record. 
SELECT t1.* FROM GetRecordsWithCountEquals2 t1
JOIN (Select RecordId From GetRecordsWithCountEquals2 Where [Type] = ('one') )X
ON t1.RecordId = X.RecordId
AND t1.Type = 'average'     UNION ALL   

-- Condition 2: When COUNT(RecordId) = 1
SELECT * FROM GetRecordsWithCountEquals1    

結果

ID  RecordId    Type    Reading IsDeleted   Cnt
1   1            one    4             0     4
2   1            one    5             0     4
3   1            one    6             0     4
4   1            average5             0     4
5   2            one    1             0     3
6   2            one    3             0     3
7   2            average2             0     3
9   3            average2             0     2
11  4            average6             0     2
12  5            one    7             0     1
于 2012-09-25T08:46:10.280 に答える
1

テーブルの名前が であると仮定してthe_table、次のようにします。

select main.*
from the_table as main
inner join (
  select recordId, count(Id) as num, count(distinct Reading) as reading_num
  from the_table
  group by recordId
) as counter on counter.recordId=main.recordId
where num=1 or num>2 or reading_num=2 or main.type='average';

テストされていませんが、その変形である必要があります。

フィドルでここでテストを編集

簡単な要約は、テーブルを o=itself の集計バージョンで結合し、言及したカウント基準に基づいてフィルター処理することです (num=1、次に表示; num=2、数値を読み取る場合は平均レコードのみを表示)それ以外の場合は両方を表示; num>2、すべてのレコードを表示)。

于 2012-09-25T07:03:20.863 に答える
1
;with a as
(
select Id,RecordId,Type,Reading,IsDeleted, count(*) over (partition by RecordId, Reading) cnt, 
row_number() over (partition by RecordId, Reading order by Type, RecordId) rn
from table
)
select Id,RecordId,Type,Reading,IsDeleted
from a where cnt <> 2 or rn = 1
于 2012-09-25T08:02:40.853 に答える