Найти строки с повторяющимися столбцами, но отличающиеся на один столбец с указанным значением - PullRequest
1 голос
/ 10 июня 2019

У меня есть эти данные:

ID  PERSNR  YEARNR  MONTHNR DAYNR   ABSTIME ABSID   ABSCALC TypeLine
---------------------------------------------------------------------
 1  26      2018    12      3       480     3       11      0
 2  26      2018    12      3       480     3       11      1
 5  26      2018    10      1        60     1       31      0
 8  26      2018    10      3        60     1       31      0
13  69      2018    12      3       480     3       11      0
14  69      2018    12      3       480     3       11      1
19  69      2018     9      3        60     3       31      1
22  69      2018     9      3        60     3       31      0
23  69      2018     9      3       420    21       11      0
26  69      2018     9      6       120    21       31      1
29  69      2018     9     10       120    21       31      1
32  69      2018     9      4       480    21       11      1

Мне нужно определить следующие ситуации:

  1. строки, которые имеют TypeLine и 0, и 1 Result Id's: 1и 2;13 и 14, 19 и 22 * ​​1008 *

  2. строки, которые имеют только TypeLine только 0 Идентификаторы результата: 5;8;23

  3. строк, которые имеют только TypeLine только 1 Идентификаторы результата: 26, 29, 32

Я не уверен, что создать эти 3сценариев, и я не смог найти решение.

Не могли бы вы мне помочь?

Ответы [ 3 ]

1 голос
/ 10 июня 2019

Делает ли это то, что вы хотите?

select (case when cnt_type_0 > 0 and cnt_type_1 > 0
             then 'Condition 1'
             when cnt_type_1 = 0
             then 'Condition 2'
             when cnt_type_0 = 0
             then 'Condition 3'
        end) as condition,
       t.*
from (select t.*,
             count(*) over (partition by ID, PERSNR, YEARNR, MONTHNR, DAYNR, ABSTIME, ABSID, ABSCALC) as cnt,
             sum(case when TypeLine = 0 then 1 else 0 end) over (partition by ID, PERSNR, YEARNR, MONTHNR, DAYNR, ABSTIME, ABSID, ABSCALC) as cnt_type_0,             
             sum(case when TypeLine = 1 then 1 else 0 end) over (partition by ID, PERSNR, YEARNR, MONTHNR, DAYNR, ABSTIME, ABSID, ABSCALC) as cnt_type_1
       from t
      ) t
where cnt >= 2;

Вы можете добавить условия в предложение WHERE, чтобы получить строки только одного типа.

0 голосов
/ 10 июня 2019

Если исходные данные верны, вы можете выполнить следующие 3 запроса.# 1 в настоящее время отвечает правильно, но # 2 и # 3 имеют разные DAYNUM в текущей версии вопроса, поэтому вы не будете ничего возвращать, используя эти значения примера ...

--1
SELECT T1.ID AS [T1_ID], T2.ID AS [T2_ID]
  FROM [tablename] T1 INNER JOIN [tablename] T2 ON T1.PERSNR = T2.PERSNR 
  AND T1.YEARNR = T2.YEARNR AND T1.MONTHNR = T2.MONTHNR
  AND T1.DAYNR = T2.DAYNR AND T1.ABSTIME = T2.ABSTIME
  AND T1.ABSID = T2.ABSID AND T1.ABSCALT = T2.ABSCALT
  AND (T1.TypeLine = 0 AND T2.TypeLine = 1
       OR
       T1.TypeLine = 1 AND T2.TypeLine = 0
      )
  AND T1.ID < T2.ID

--2
SELECT T1.ID AS [T1_ID], T2.ID AS [T2_ID]
  FROM [tablename] T1 INNER JOIN [tablename] T2 ON T1.PERSNR = T2.PERSNR 
  AND T1.YEARNR = T2.YEARNR AND T1.MONTHNR = T2.MONTHNR
  AND T1.DAYNR = T2.DAYNR AND T1.ABSTIME = T2.ABSTIME
  AND T1.ABSID = T2.ABSID AND T1.ABSCALT = T2.ABSCALT
  AND T1.TypeLine = 0 AND T2.TypeLine = 0
  AND T1.ID < T2.ID

--3 
SELECT T1.ID AS [T1_ID], T2.ID AS [T2_ID]
  FROM [tablename] T1 INNER JOIN [tablename] T2 ON T1.PERSNR = T2.PERSNR 
  AND T1.YEARNR = T2.YEARNR AND T1.MONTHNR = T2.MONTHNR
  AND T1.DAYNR = T2.DAYNR AND T1.ABSTIME = T2.ABSTIME
  AND T1.ABSID = T2.ABSID AND T1.ABSCALT = T2.ABSCALT
  AND T1.TypeLine = 1 AND T2.TypeLine = 1       
  AND T1.ID < T2.ID
0 голосов
/ 10 июня 2019

Попробуйте что-то вроде этого:

SELECT DISTINCT ID, 
PERSNR, 
YEARNR, 
MONTHNR, 
DAYNR, 
ABSTIME, 
ABSID, 
ABSCALC, 
iif(count(TypeLine) >= 2, 'duplicate', iif(min(TypeLine) = 1, '1', '0')) as status
FROM table
GROUP BY ID, PERSNR, YEARNR, MONTHNR, DAYNR, ABSTIME, ABSID, ABSCALC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...