programing

모든 카테고리에서 랜덤으로 2개 레코드 선택 그룹 in MariaDB

stoneblock 2023. 10. 26. 20:35

모든 카테고리에서 랜덤으로 2개 레코드 선택 그룹 in MariaDB

MariaDB 온라인 컴파일러에서 다음 결과를 반환하려고 합니다(MySQL의 각 카테고리에서 2개 제품 선택).

데이터베이스의 각 카테고리에서 2개 레코드의 랜덤 그룹 반환test1.csv.

test1데이터 집합:

id,name,category
150,apple,fruit
153,orange,fruit
187,kiwi,fruit
189,banana,fruit
142,beef,meat
141,pork,meat
143,rabbit,meat
146,chicken,meat
410,pepsi,drinks
413,milk,drinks
418,coffee,drinks
415,mate,drinks
581,carrot,vegetables
586,tomato,vegetables
589,cucumber,vegetables
582,broccoli,vegetables

MariaDB 컴파일러에서 테스트를 재현합니다. https://onecompiler.com/mariadb/3ymv4a6e6

코드:

-- create
CREATE TABLE test1 (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  category TEXT NOT NULL
);

-- insert
INSERT INTO test1 VALUES (150,'apple','fruit');
INSERT INTO test1 VALUES (153,'orange','fruit');
INSERT INTO test1 VALUES (187,'kiwi','fruit');
INSERT INTO test1 VALUES (189,'banana','fruit');
INSERT INTO test1 VALUES (142,'beef','meat');
INSERT INTO test1 VALUES (141,'pork','meat');
INSERT INTO test1 VALUES (143,'rabbit','meat');
INSERT INTO test1 VALUES (146,'chicken','meat');
INSERT INTO test1 VALUES (410,'pepsi','drinks');
INSERT INTO test1 VALUES (413,'milk','drinks');
INSERT INTO test1 VALUES (418,'coffee','drinks');
INSERT INTO test1 VALUES (415,'mate','drinks');
INSERT INTO test1 VALUES (581,'carrot','vegetables');
INSERT INTO test1 VALUES (586,'tomato','vegetables');
INSERT INTO test1 VALUES (589,'cucumber','vegetables');
INSERT INTO test1 VALUES (582,'broccoli','vegetables');

-- fetch 
SET @prev=0,@rownum=0;
SELECT id, name, category 
FROM (
  SELECT *, 
         IF( @prev <> category, 
             @rownum := 1, 
             @rownum := @rownum+1 
         ) AS rank, 
         @prev := category, 
         @rownum  
  FROM (
    SELECT * FROM test1 
    ORDER BY category, rand()
  ) random_test1
) test1_ranked 
WHERE rank <= 2;

위의 코드와 같이 단일 카테고리와 동일한 카테고리에서 랜덤 레코드 2개만 반환합니다.

주어진 데이터 집합 test1에 대한 의도된 결과의 예는 다음과 같습니다.

2개의 레코드(또는 무작위로 선택한 경우) x 4개의 카테고리(사용 가능한 모든 카테고리는 프로덕션 데이터셋에서 훨씬 더 많음)

예를 들어,

150,apple,fruit
153,orange,fruit
142,beef,meat
141,pork,meat
418,coffee,drinks
415,mate,drinks
589,cucumber,vegetables
582,broccoli,vegetables

임의 선택을 단일 범주가 아닌 모든 범주로 제어/확장하는 방법은 무엇입니까?

By, Rank, Rand 문서 순서를 살펴보았지만 하위 카테고리/그룹 적용에 대한 언급을 찾을 수 없었습니다.

나는 정확한 예상 결과에 대한 유사한 비단뱀과 판다의 예를 발견했습니다: 5. 판다는 그룹별로 줄을 표본으로 삼습니다.

df.groupby('color').apply(lambda x: x.sample(n=3)).reset_index(drop = True)

MariaDb에서 동일한 결과를 얻는 방법은?

당신의 도움에 감사드립니다.

언급URL : https://stackoverflow.com/questions/74303723/random-select-2-records-from-all-categories-groups-in-mariadb