シーケンスの最初の要素を返すFIRST集計関数が必要です。これをHAVING節とともに使用します。CLRユーザ定義集合関数
これは私の以前の質問の続きとして見ることができる質問です:FIRST aggregate function which I can use with HAVING clause。
それが唯一の集約関数は、私は1つ作成しようとしたので、私の問題を解決できることが判明:
[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined, //use clr serialization to serialize the intermediate result
IsInvariantToNulls = true, //optimizer property
IsInvariantToDuplicates = false, //optimizer property
IsInvariantToOrder = false, //optimizer property
MaxByteSize = 8000) //maximum size in bytes of persisted value
]
public struct GetFirst : IBinarySerialize {
private string allValues;
public void Init() {
allValues = string.Empty;
}
private void incrementAndAdd(SqlInt32 value) {
allValues += (value.Value.ToString() + ",");
}
public void Accumulate(SqlInt32 Value) {
incrementAndAdd(Value);
}
public void Merge(GetFirst Group) {
}
public SqlInt32 Terminate() {
// Put your code here
return new SqlInt32(int.Parse(allValues.Split(',')[0]));
}
// This is a place-holder member field
private SqlInt32 var1;
public void Read(System.IO.BinaryReader r) {
allValues = r.ReadString();
}
public void Write(System.IO.BinaryWriter w) {
w.Write(this.allValues);
}
}
をそして、これは私がそれを使用する方法である:それは時々適切に返す
DECLARE @fooTable AS TABLE(
ID INT,
CategoryName NVARCHAR(100),
Name NVARCHAR(100),
MinAllow INT,
Price DECIMAL(18,2)
);
INSERT INTO @fooTable VALUES(1, 'Cat1', 'Product1', 3, 112.2);
INSERT INTO @fooTable VALUES(2, 'Cat2', 'Product2', 4, 12.34);
INSERT INTO @fooTable VALUES(3, 'Cat1', 'Product3', 5, 233.32);
INSERT INTO @fooTable VALUES(4, 'Cat3', 'Product4', 4, 12.43);
INSERT INTO @fooTable VALUES(5, 'Cat3', 'Product5', 1, 13.00);
INSERT INTO @fooTable VALUES(7, 'Cat4', 'Product7', 1, 15.00);
INSERT INTO @fooTable VALUES(6, 'Cat4', 'Product6', 3, 13.00);
DECLARE @minAllowParam AS INT = 3;
SELECT ft.CategoryName, SUM(ft.Price), dbo.GetFirst(ft.MinAllow) FROM @fooTable ft
GROUP BY ft.CategoryName
HAVING dbo.GetFirst(ft.MinAllow) >= @minAllowParam;
を結果、時にはそうではなく、私はそれを正しく実装したかどうかは分かりません。私の要求を考慮してこの権利を得たのであれば、どんな考えですか?
あれば(それはない、@Mikaelエリクソンが指摘するように)場合注文保証が存在していた、あなたは*あなたのクエリの順序を指定していない*テーブル順序を持たないので、 'ORDER BY 'が出現しない' FIRST'を問い合わせる*クエリのどこか*が正しく定義されていません。 –