2

私は大きな問題を抱えています。誰かが私に手を貸してくれませんか?

私の最初の目的は、重複データをクエリステートメント(削除ではなく選択)でfliterすることです。つまり、フィードバックが繰り返されるため、同じServiceIDのEndTimeとQosのさまざまなエントリが表示されます。ルールは、同じServiceIDのQosが最も低いレコードのみを保持することです。Qosが最も低いレコードが複数ある場合は、これらのレコードのいずれか1つだけを保持します。クライアントはこのスキームを受け入れ、それを好みます。この例では、ID = 6,7、および8の場合、6または7を保持します。この目的の答えはここにあります。

SELECT DISTINCT serviceid,tcid,endtime,qos 
FROM (SELECT * 
      FROM service 
      ORDER BY serviceid, qos, id) AS base 
GROUP BY serviceid

aim2:Qos=1はSatisfiedServiceを表します。各テクニカルサポートエンジニアによって達成された月間合計満足サービスは、「今月の個人合計満足サービス」と呼ばれます。「今月のパーソナルトータル満足サービス」がその月のトップ2にランクインしているテクニカルサポートエンジニアを「今月からのトップ2」と呼びます。毎月「今月からトップ2」を獲得できるほど優秀な場合は、「クラス1優秀」と呼ぶことができます。全体として、このステップは「クラス1の卓越性」を計算することです。この例では、1月の「今月以降のトップ2」はAndrewとJacobであり、2月の「Top2」はAndrew、Dlyan、およびJacobです。そのため、アンドリューとジェイコブ(この2台のレコーダーのみ)に「クラス1の傑出した」という栄誉の称号が授与されます。

aim2を手伝ってください(最終的には目標4に到達する必要があります)、目標2の結果は次のようになります。

TCID
アンドリュー
ジェイコブ
説明:年間を通じていくつかの技術サービスデータ(ServiceID、TCID、EndTime、およびQoS)があり、重複があるため、IDは一意の主キーです。

念のために言っておきますが、クライアントはSQLを実装するために、データベース内のストアドプロシージャではなく、SQLのみを受け入れます。そして、顧客がデータベースの作成を許可しなかったため、クエリステートメントのみが必要です。

 some data:
ServiceID ID TCID EndTime Qos
20002ジェイコブ2011/1/12
20003ジェイコブ2011/1/12
20014ジェイコブ2011/1/12
20025ジェイコブ2011/2/31
20036タイラー2011/1/41

データ構造:

  • ID:レコードの一意の主キー
  • ServiceID:特定のサービスのID
  • TCID:テクニカルサポートエンジニアのID
  • EndTime:サービスの終了時間
  • Qos:サービス品質(1満足、2平均、3不満足/不満)。

DDLと挿入SQL(mysql5):

CREATE TABLE `service` (
  `ServiceID` INTEGER(11) NOT NULL,
  `ID` INTEGER(11) NOT NULL ,
  `TCID` VARCHAR(40)  NOT NULL,
  `EndTime` DATE NOT NULL,
  `Qos` CHAR(1)  NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `ID` (`ID`)
);
COMMIT;
INSERT INTO `service` (`ServiceID`, `ID`, `TCID`, `EndTime`, `Qos`) VALUES
  (2004, 9, 'Jacob', '2011-02-04', '1'),
  (2000, 2, 'Jacob', '2011-01-01', '2'),
  (2000, 3, 'Jacob', '2011-01-01', '2'),
  (2001, 4, 'Jacob', '2011-01-01', '2'),
  (2002, 5, 'Jacob', '2011-02-03', '1'),
  (2003, 6, 'Tyler', '2011-01-04', '1'),
  (2003, 7, 'Tyler', '2011-01-04', '1'),
  (2003, 8, 'Tyler', '2011-01-03', '2'),
  (2005, 10, 'Jacob', '2011-02-05', '1'),
  (2006, 11, 'Jacob', '2011-02-04', '2'),
  (2007, 12, 'Jacob', '2011-01-08', '1'),
  (2008, 13, 'Tyler', '2011-02-06', '1'),
  (2009, 14, 'Dylan', '2011-02-08', '1'),
  (2010, 15, 'Dylan', '2011-02-09', '1'),
  (2014, 16, 'Andrew', '2011-01-01', '1'),
  (2013, 17, 'Andrew', '2011-01-01', '1'),
  (2012, 18, 'Andrew', '2011-02-19', '1'),
  (2011, 19, 'Andrew', '2011-02-02', '1'),
  (2015, 20, 'Andrew', '2011-02-01', '1'),
  (2016, 21, 'Andrew', '2011-01-19', '1'),
  (2017, 22, 'Jacob', '2011-01-01', '1'),
  (2018, 23, 'Dylan', '2011-02-03', '1'),
  (2019, 24, 'Dylan', '2011-01-09', '1'),
  (2020, 25, 'Dylan', '2011-01-01', '1'),
  (2021, 26, 'Andrew', '2011-01-03', '1'),
  (2021, 27, 'Dylan', '2011-01-11', '1'),
  (2022, 28, 'Jacob', '2011-01-09', '1'),
  (2023, 29, 'Tyler', '2011-01-19', '1'),
  (2024, 30, 'Andrew', '2011-02-01', '1'),
  (2025, 31, 'Dylan', '2011-02-03', '1'),
  (2026, 32, 'Jacob', '2011-02-04', '1'),
  (2027, 33, 'Tyler', '2011-02-09', '1'),
  (2028, 34, 'Daniel', '2011-01-06', '1'),
  (2029, 35, 'Daniel', '2011-02-01', '1');
 COMMIT;

これが私の最初の2つの目的であり、さらに2つあります。これらのすべてのステップを、次々に完了することを目的としています。誰かが最初の目標を達成するのを手伝ってもらえますか?かなり複雑で、よろしくお願いします。

目標3:次に、「クラス2の優秀」(「今月以降のトップ2」のエンジニアは含まれていません)を計算することは、3位と4位のランクを計算することと同じです。この例では、「クラス2の傑出」はタイラーです。

目標4:最終目標は、「クラス1の卓越性」と「クラス2の卓越性」を組み合わせることです。結果は最終的にレンダリング用のレポートに転送されます。私のデータセットは次のようになります。

TCID       level
Andrew     top2
Jacob      top2
Tyler      top4

目標1の結果は次のようになります。

20002ジェイコブ2011/1/12
20014ジェイコブ2011/1/12
20025ジェイコブ2011/2/31
20036タイラー2011/1/41
20049ジェイコブ2011/2/41
200510ジェイコブ2011/2/51
200611ジェイコブ2011/2/42
200712ジェイコブ2011/1/81
200813タイラー2011/2/61
200914ディラ2011/2/81
2010 15 Dyla 2011/2/9 1
201119アンドリュー2011/2/21
201218アンドリュー2011/2/191
201317アンドリュー2011/1/11
201416アンドリュー2011/1/11
201520アンドリュー2011/2/11
201621アンドリュー2011/1/191
201722ジェイコブ2011/1/11
2018 23 Dyla 2011/2/3 1
2019 24 Dyla 2011/1/9 1
2020 25 Dyla 2011/1/1 1
202126アンドリュー2011/1/31
202228ジェイコブ2011/1/91
202329タイラー2011/1/191
202430アンドリュー2011/2/11
2025 31 Dyla 2011/2/3 1
202632ジェイコブ2011/2/41
202733タイラー2011/2/91
202834ダニエル2011/1/61
202935ダニエル2011/2/11
4

2 に答える 2

1

最後に、esProc を使用してこの問題を解決するソリューションを見つけました。esProc は私が見つけた唯一のソリューションです。はい、resultSet オブジェクトを返すことができ、レポート ツール (私は Jasper を使用しています) によって呼び出されます。しかし、まだ SQL ソリューションが必要です。それで、SQLの解決策があれば教えてください。お返事をありがとうございます。

esProc ソリューション

このソリューションに関する情報を次に示します: http://www.esproc.com/tour/what-is-esproc.html

または、ここに SQL Server ソリューションがあります (ただし、 mysqlには適していません)。

これが同じ問題に遭遇した人々に役立つことを願っています。

于 2012-04-23T05:49:26.330 に答える
0

このクエリは、SERVICE_ID ごとに 1 つの行のみを選択することを意図しています。対応する SERVICE_ID の QO が最も低いレコードのみが含まれ、1 つだけを選択することで複数の行を回避します。「これらのレコードのいずれかを保持する」と述べたように、rowidを使用して1つのレコードをランダムに選択しました

この条件の選択クエリを実行して、削除コマンドを実行する前に、抽出されたレコードに問題がないかどうかを確認できます。


DELETE FROM SERVICE S
 WHERE S.SERVICEID IN (SELECT DISTINCT S.SERVICEID
                         FROM SERVICE S
                        GROUP BY S.SERVICEID
                       HAVING COUNT(*) > 1)
   AND S.QOS =
       (SELECT MIN(S1.QOS) FROM SERVICE S1 WHERE S1.SERVICEID = S.SERVICEID)
   AND ROWID =
       (SELECT MIN(ROWID) FROM SERVICE S1 WHERE S1.SERVICEID = S.SERVICEID)

Hope it helps

于 2012-04-17T08:18:55.003 に答える