2017-11-28 24 views
2

각 열에 값 또는 NULL을 포함 할 수있는 카산드라 표가 있습니다. 그러나 NULL을 포함하는 경우 해당 열의 다음 값도 모두 NULL임을 알고 있습니다. 이 같은카산드라 : 열에 null이 아닌 값을 가진 마지막 항목을 얻으십시오.

뭔가 :

+------------+---------+---------+---------+ 
|  date | column1 | column2 | column3 | 
+------------+---------+---------+---------+ 
| 2017-01-01 |  1 |  'a' | NULL | 
| 2017-01-02 |  2 |  'b' | NULL | 
| 2017-01-03 |  3 | NULL | NULL | 
| 2017-01-04 |  4 | NULL | NULL | 
| 2017-01-05 | NULL | NULL | NULL | 
+------------+---------+---------+---------+ 

나는 주어진 열의, null이 아닌 값으로 마지막 열 날짜를 반환하는 쿼리가 필요합니다. 이 경우 : 2 열 들어

, 컬럼에 대한
  • , '2017년 1월 4일'
  • 는 '2017년 1월 2일'3 열 들어
  • , 어떤 결과가 반환되지 않습니다. SQL에서

는이 같은 것입니다 :

SELECT date 
FROM my_table 
WHERE column1 IS NOT NULL 
ORDER BY date DESC LIMIT 1 

이 가능 어떤 식 으로든, 아니면 전혀 NULL 상황을 피하기 위해 각 열에 대해 하나 개의 테이블에 테이블을 중단해야합니까?

답변

2

tldr; 이것을 별도로 추적하는 새 테이블을 만듭니다.

'열 1'이 기본 키의 일부이거나 2 차 인덱스 또는 구체화 된보기 인 경우에만 가능합니다.

기본 키에 null이 포함되는 것을 원하지 않습니다. 옆으로 널의 나머지 부분에 null의 'UNSET'inplace를 쓰고 있는지 확인하십시오. 이것은 운전자가 처리해야하지만 일부 운전자는 몹시 성숙하지 않습니다. nulls를 쓰는 것은 사실상 삭제 연산이므로 삭제 표시가 발생합니다.

보조 색인은 잠재적으로 전체 클러스터에 충돌하고 특정 지점을 지나치게 확장하지 않기 때문에 성능 문제가 있습니다.

구체화 된 뷰는 향후 제공되지 않을 예정이므로 권장하지 않습니다.

이 정확한 기능을 추적하는 별도의 표를 만들어 더 나은 서비스를 제공 할 수 있습니다. 이는 다중 쓰기 및 다중 읽기를 의미하지만 큰 테이블 스캔 및 보조 색인은 피할 수 있습니다.

파티션을 날짜별로 작성하지 않아도되고 너비가 넓은 행이 있다고 가정 할 것입니다. 왜냐하면이 레이아웃이 더 간단 해지기 때문입니다. 그러나 이것이 그 모양입니다.

CREATE TABLE my_table (
    partition bigint, 
    date text, 
    column1 bigint, 
    column2 text, 
    column3 text, 
PRIMARY KEY(partition, date); 

CREATE TABLE offset_tracker(
    partition bigint, 
    date text, 
PRIMARY KEY(partition); 

여기서 '값이 가장 큰 날짜'를 얻으려면 select date FROM offset_tracker WHERE partition=x을 입력하면됩니다.