GroupBy + Условие - PullRequest
       22

GroupBy + Условие

0 голосов
/ 03 мая 2018

Если у меня есть стол вроде

ID | Start  | End    | Name | Code
1  | 1000   | 1001   | ABC1 |  A
1  | 1000   | 1001   | FSD1 |  B
2  | 1200   | 1201   | CC12 |  A
3  | 4000   | 4002   | GF41 |  B
3  | 4000   | 4002   | ML65 |  A     

Используя стандарт SQL, можем ли мы написать следующее условие:

если для (ID, Start, End), код A и B, то печатается только запись w / B. В противном случае распечатайте запись. Вот вывод:

ID | Start  | End    | Name | Code
1  | 1000   | 1001   | FSD1 |  B
2  | 1200   | 1201   | CC12 |  A
3  | 4000   | 4002   | GF41 |  B

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вы можете сделать это, используя row_number():

select t.*
from (select t.*,
             row_number() over (partition by id order by code desc) as seqnum
      from t
     ) t
where seqnum = 1;

Преимущество этого подхода по сравнению с подходом агрегации состоит в том, что он легко включает все столбцы без затрат на агрегацию.

0 голосов
/ 03 мая 2018

Ниже для BigQuery Standrad SQL

#standardSQL
WITH `project.dataset.your_table`  AS (
  SELECT 1 id, 1000 start, 1001 `end`, 'ABC1' name, 'A' code UNION ALL
  SELECT 1, 1000, 1001, 'FSD1', 'B' UNION ALL
  SELECT 2, 1200, 1201, 'CC12', 'A' UNION ALL
  SELECT 3, 4000, 4002, 'GF41', 'B' UNION ALL
  SELECT 3, 4000, 4002, 'ML65', 'A' 
)
SELECT 
  id, start, `end`, 
  ARRAY_AGG(STRUCT(name, code) ORDER BY code DESC LIMIT 1)[OFFSET(0)].*
FROM `project.dataset.your_table`
GROUP BY id, start, `end` 
-- ORDER BY id

результат должен быть

Row id  start   end     name    code     
1   1   1000    1001    FSD1    B    
2   2   1200    1201    CC12    A    
3   3   4000    4002    GF41    B     

Альтернативный вариант с тем же результатом, но может быть полезен, если в вашей таблице есть другие / другие поля, которые необходимо включить в вывод

#standardSQL
WITH `project.dataset.your_table`  AS (
  SELECT 1 id, 1000 start, 1001 `end`, 'ABC1' name, 'A' code UNION ALL
  SELECT 1, 1000, 1001, 'FSD1', 'B' UNION ALL
  SELECT 2, 1200, 1201, 'CC12', 'A' UNION ALL
  SELECT 3, 4000, 4002, 'GF41', 'B' UNION ALL
  SELECT 3, 4000, 4002, 'ML65', 'A' 
)
SELECT row.*
FROM (
  SELECT ARRAY_AGG(t ORDER BY code DESC LIMIT 1)[OFFSET(0)] row
  FROM `project.dataset.your_table` t
  GROUP BY id, start, `end` 
)
-- ORDER BY id
...