La position actuelle:Accueil du site>Distribution des données via SQL

Distribution des données via SQL

2022-07-23 00:01:16Excellent comme un germe de haricot

Contexte opérationnel:J'ai rencontré un besoin au travail,Il y a une montre de magasin、Et une table d'utilisateurs.Besoin de distribuer la part des ventes des utilisateurs dans les magasins aux différents magasins.C'est pourquoi cet article

Idées:.Sur la base des ventes par magasin et du total de tous les magasins,Trouver la part des ventes par magasin.Selon la part des ventes、Distribuer 10 000 clients aux magasins

Insérer la description de l'image ici

Voici des exemples de données::

## Liste des magasins
CREATE TABLE `store_mapping` (
  `store_id` varchar(255) NOT NULL COMMENT 'Code du magasin',
  `amt_rate` varchar(255) DEFAULT NULL COMMENT 'Part des ventes',
  PRIMARY KEY (`store_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
## Tableau des utilisateurs
CREATE TABLE `consumer` (
  `user_id` varchar(255) NOT NULL COMMENT 'Code utilisateur',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
##  Tableau final de stockage des données 
CREATE TABLE `distribute_over` (
  `user_id` int NOT NULL COMMENT 'Code utilisateur',
  `store_id` int DEFAULT NULL COMMENT 'Code du magasin',
  `rn` varchar(255) DEFAULT NULL COMMENT 'rankValeur',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
insert into store_mapping values ("1001","0.05");
insert into store_mapping values ("1002","0.35");
insert into store_mapping values ("1003","0.2");
insert into store_mapping values ("1004","0.07");
insert into store_mapping values ("1005","0.33");
insert into consumer 
SELECT
	1000000+rn1 
FROM
	( SELECT row_number () over () rn1 FROM car ## Cette montre est prise au hasard , Vous pouvez en prendre une plus grande que 10000Tableau des données
	) a 
	LIMIT 10000;

follow me、follow me

1. Nombre de personnes à distribuer dans chaque magasin

SELECT
	store_id,
	round( amt_rate * user_cnt, 0 ) AS " Nombre de personnes à distribuer dans chaque magasin " 
FROM
	store_mapping,
	( SELECT count( user_id ) AS user_cnt FROM consumer ) u

2. Calculé sur la base du nombre total de personnes à distribuer dans chaque magasin (S'il te plaît.rankValeur)

SELECT
	sdd_2.store_id,
	sum( sdd_1.store_distribute_people )+ 1 
FROM
	(
	SELECT
		store_id,
		round( amt_rate * user_cnt, 0 ) AS store_distribute_people 
	FROM
		store_mapping,
		( SELECT count( user_id ) AS user_cnt FROM consumer ) u 
	) sdd_1,##store_distribute_detail_1,
	(
	SELECT
		store_id,
		round( amt_rate * user_cnt, 0 ) AS store_distribute_people 
	FROM
		store_mapping,
		( SELECT count( user_id ) AS user_cnt FROM consumer ) u 
	) sdd_2 ##store_distribute_detail_2,
WHERE
	sdd_1.store_id <= sdd_2.store_id 
GROUP BY
	sdd_2.store_id 

3.Données mal alignées

SELECT
	store_id,
CASE
		
		WHEN lag ( rn1, 1 ) over () IS NULL THEN
		1 ELSE lag ( rn1, 1 ) over () 
	END AS rn2,
	rn1 
FROM
	(
	SELECT
		sdd_2.store_id,
		sum( sdd_1.store_distribute_people )+ 1 AS rn1 
	FROM
		(
		SELECT
			store_id,
			round( amt_rate * user_cnt, 0 ) AS store_distribute_people 
		FROM
			store_mapping,
			( SELECT count( user_id ) AS user_cnt FROM consumer ) u 
		) sdd_1,##store_distribute_detail_1,
		(
		SELECT
			store_id,
			round( amt_rate * user_cnt, 0 ) AS store_distribute_people 
		FROM
			store_mapping,
			( SELECT count( user_id ) AS user_cnt FROM consumer ) u 
		) sdd_2 ##store_distribute_detail_2,
		
	WHERE
		sdd_1.store_id <= sdd_2.store_id 
	GROUP BY
		sdd_2.store_id 
	) a 

4. Début de la distribution

Si votreSQLSoutienISNULL/NVLFonctions, Peut remplacer CASE WHEN.

-- insert into distribute_over --Confirmer que les données sont correctes、 Dans la table finale 
SELECT
	user_id,store_id,rn
FROM
	( SELECT user_id, row_number () over ( ORDER BY user_id ) rn FROM consumer ) user_info
	LEFT JOIN (
	SELECT
		store_id,
	CASE
			WHEN lag ( rn1, 1 ) over () IS NULL THEN
			1 ELSE lag ( rn1, 1 ) over () 
		END AS rn2, -- Si votresqlSoutienISNULL/NVLAlors pas besoincase whenC'est
		rn1 
	FROM
		(
		SELECT
			sdd_2.store_id,
			sum( sdd_1.store_distribute_people )+ 1 AS rn1 
		FROM
			(
			SELECT
				store_id,
				round( amt_rate * user_cnt, 0 ) AS store_distribute_people 
			FROM
				store_mapping,
				( SELECT count( user_id ) AS user_cnt FROM consumer ) u 
			) sdd_1,##store_distribute_detail_1,
			(
			SELECT
				store_id,
				round( amt_rate * user_cnt, 0 ) AS store_distribute_people 
			FROM
				store_mapping,
				( SELECT count( user_id ) AS user_cnt FROM consumer ) u 
			) sdd_2 ##store_distribute_detail_2,
			
		WHERE
		sdd_1.store_id <= sdd_2.store_id GROUP BY sdd_2.store_id ) a ) dis ON user_info.rn >= dis.rn2 
	AND user_info.rn < dis.rn1

5.Validation des données- En accord avec l'effet idéal .

SELECT
	count( DISTINCT user_id ) 
FROM
	distribute_over 
GROUP BY
	store_id;

Contenu connexe

kettleComponents【Requête de dimension/Mise à jour】Utilisation de
https://blog.csdn.net/weixin_43932609/article/details/124734608?spm=1001.2014.3001.5501
kettleComponentsHTTP clientComment utiliser
https://blog.csdn.net/weixin_43932609/article/details/123984884?spm=1001.2014.3001.5502
Kettle Exportation circulaire de données complètes de la Bibliothèque
https://blog.csdn.net/weixin_43932609/article/details/119610480?spm=1001.2014.3001.5502
ETLOutilskettleComment calculer
https://blog.csdn.net/weixin_43932609/article/details/110371110
KettleDans l'outilRest clientUtilisation des composants!!
https://blog.csdn.net/weixin_43932609/article/details/109988783

=========================================================

La vie doit être heureuse,Ne laissez pas la bouteille d'or vide contre la lune!
__ .Un programmeur passionné de rap .
Musique recommandée aujourd'hui :Sung - woo.DamnShine / KEY.LLiu Cong / ICE《 Longli Wire (LIVEÉdition)》

=========================================================

Mentions de copyright
Auteur de cet article [Excellent comme un germe de haricot],Réimpression s’il vous plaît apporter le lien vers l’original, merci
https://fra.chowdera.com/2022/204/202207221302498034.html

Recommandé au hasard