-1

動的に生成された SQL クエリに問題があります。ユーザーが異なるテーブルに格納されている巨大なデータベースがあります。異なるパーティショニングのいくつかの制限に基づいて、user_id-s を返すクエリを動的に作成する必要があります。これまでのところ、制限に基づいてクエリを作成するロジックを作成しましたが、結果をフィルタリングして異なるパーティションを作成する方法がわかりません。例えば:

私は次のものを持っています:

1: 男性
2: 女性
3: 18 歳から 24 歳
4: 25 歳から 99 歳
5: IBM で働いている 5 万人の
女性と 5 万人の男性がいるとしましょう

ここで、私の制限が (1 または 2) と 5 の場合、つまり IBM で働く男性または女性である場合、次のようなものを生成しました。

SELECT DISTINCT user_id from usertable1 where age in (0,1) 
INTERSECT
SELECT DISTINCT user_id from usertable2 where work_place = 'IBM'

今私の問題は、これでは十分ではないということです。たとえば、結果リストに男性が 33%、女性が 66% になるように、結果のユーザー ID のセットを分割する必要がある場合があります。正しい入手方法がわかりません。私が持っている女性と男性のユーザーの数を数えてみました。次に、次のようにトップを適用しました。

SELECT DISTINCT  top 25000 user_id from usertable1 where age in (0)
UNION 
SELECT DISTINCT top 50000  user_id from usertable1 where age in (1)
SELECT DISTINCT user_id from usertable2 where work_place = 'IBM'

しかし、これは私に正しい解決策を与えていません.これの問題は、リストにIBMで働いている女性ユーザーがいない場合、25kの男性と0人の女性が返されることです.33%の男性と66%の女性ではありません.. .

さらに複雑にするために、結果には 33% の男性が含まれ、75% が 18 ~ 24 歳から 25% の年齢で、25 ~ 99 歳が 66% の女性で、75% が年齢であるというように、さらに難しいパーティショニングを行うことができます。 18~24 歳と 25 歳未満

したがって、私の問題は、巨大なデータベースで機能する両方の問題を解決する方法がわからないことです。50k の男性と 50k の女性は、完全なデータベースに比べて小さいです。誰でも私の問題の少なくとも1つについて何か考えがありますか?

編集 1: 私のテーブルには少し奇妙な構造があり、リンク テーブルに似ています。それを単純化し、私の問題を示すために、私のものと同様の形式を持つこの例の表を考えてみましょう。user_id、question、question_answer、age、gender があります。これは単なるリンク テーブルであり、ユーザーは主に複数の質問に回答するため、同じ user_id が複数回表示されます。これの構造は私が知っている限りでは最適ではありませんが、私が設計したものではなく、私が変更することもできません. 私の仕事は、すべての制限を完了する個別の user_id を取得し、結果をフィルタリングして、別の制限セットに基づいてパーセンテージ パーティションを作成することです。これまでのところ、制限に基づいて正しい user_id を取得しましたが、これを変更してパーセンテージ パーティションを作成する方法がわかりません。

したがって、より正確に言うと、(1 OR 2) AND 3 AND 4 などの制限セットがあります。これから順番に解けるように逆磨きフォームを作成します。すべての制限 (たとえば、男性、18 歳から 24 歳まで) に基づいて、折り丁を作成し、それを結合または交差させて連結します。分割する必要がない限り、これはうまく機能します。しかし、残念ながらそうです。私の結果には、回答された質問に関する詳細が含まれておらず、年齢も性別もuser_idのみが含まれているため、結果をフィルタリングして必要なパーティションを作成できるようにする方法がわかりませんパーセンテージでサイズ。

4

1 に答える 1

0

SQL Server 2005+を使用している場合は、使用できますTOP(x)PERCENT

USE AdventureWorks2012;
GO
SELECT TOP(5)PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;

このリンクから取得

投稿の残りの部分を読むだけですが、CTE を使用して 2 番目の問題を解決し、それらを連鎖させることができるはずです。それは、70% の 40% を取る 2 番目の CTE にフィードする何かの 70% を言うことになります。

于 2013-09-24T10:04:34.600 に答える