将数据存储到新表中

时间:2018-01-12 17:23:24

标签: sql sql-server sorting

下午好,

我有两个列,我试图将其分为表格,memberid和总支出。当我运行以下查询时:

Select Memberid, totalspend
from Table
order by totalspend;

我的数据以我期望的方式返回。当我尝试并运行时:

Select MemberID, TotalSpend
into SampleTable
from Table
order by TotalSpend 

SQL不保留排序。

到目前为止,我所做的研究表明,select into语句应该可行,但由于某种原因,它不适用。我已经尝试将Totalspend转换为float,int或varchar但仍然没有运气。

我需要对数据进行排序,以便我可以根据前x行对表进行计算。

我目前正在使用SQL Server 2017。

谢谢,

理查德

1 个答案:

答案 0 :(得分:0)

  

SQL不保留排序。

这太真实了。 SQL表表示无序集。没有订购。得到它?

也就是说,您可以对数据施加排序。这有两种方法:

  1. 您可以定义主键。数据基于主键在数据页(在SQL Server中)进行物理排序。
  2. 您可以定义标识列。结合public class CustomType : ScriptableObject { public int myField; private int myProperty; public int MyProperty { get { return myProperty; } set { if (value != myProperty) { // do stuff here myProperty = value; } } } public void OnMyFieldChanged(int from, int to) { // do stuff here } } #if UNITY_EDITOR [CustomEditor(typeof(CustomType))] class CustomTypeEditor : Editor { public override void OnInspectorGUI() { CustomType customType = (CustomType)target; int field = EditorGUILayout.IntField("Field", customType.myField); if (field != customType.myField) { customType.OnMyFieldChanged(customType.myField, field); customType.myField = field; } customType.MyProperty = EditorGUILayout.IntField("Property", customType.MyProperty); } } #endif ,标识列将捕获排序。
  3. 严格地说,这些对表中查询的结果集没有影响。相反,它们是用于在数据中存储排序的方法。

    对于结果集,无序表的真实情况也是如此。所以如果你跑:

    order by

    结果集无序。这意味着即使使用主键或标识列或两者,SQL Server也可以按照所需的顺序返回行。它甚至可以在不同的运行中以不同的顺序返回数据。

    解决这个问题很简单。如果您想要按特定顺序排列数据,只需在查询中添加以下内容:

    Select MemberID, TotalSpend
    from SampleTable;
    

    如果列上有索引,那么排序通常会使用索引(除非数据非常小),因此会产生很小的开销。