Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用SQL查询环绕360度_Mysql_Sql_Math - Fatal编程技术网

Mysql 使用SQL查询环绕360度

Mysql 使用SQL查询环绕360度,mysql,sql,math,Mysql,Sql,Math,我对使用SQL非常陌生,我想学习如何有效地过滤天空区域的黄道坐标(经度、纬度)数据集。数据集位于南黄道半球(从-90到0和0到360),如下所示(用Python模拟,使用一些简单的numpy-arange命令) 我已经了解了如何使用以下代码在python中过滤特定的天空补丁: x = (eclong + 360 - center) % 360 ind = x > 180 x[ind] = x[ind] - 360 #converts from 0 to 360 to -180 to +1

我对使用SQL非常陌生,我想学习如何有效地过滤天空区域的黄道坐标(经度、纬度)数据集。数据集位于南黄道半球(从-90到0和0到360),如下所示(用Python模拟,使用一些简单的numpy-arange命令)

我已经了解了如何使用以下代码在python中过滤特定的天空补丁:

x = (eclong + 360 - center) % 360
ind = x > 180
x[ind] = x[ind] - 360 #converts from 0 to 360 to -180 to +180
x = -x #reverses scale where east direction is on left
为了允许数据点环绕南极,我还需要一个附加条件:

filtered_eclong = (x < 12/np.cos(eclat *np.pi/180)) & (-12/np.cos(eclat *np.pi/180) < x & eclat < 0)
filtered_eclong=(x<12/np.cos(eclat*np.pi/180))和(-12/np.cos(eclat*np.pi/180)
12度是我想要抓取的那片天空的宽度,中心是我想要的那片天空的中心黄道经度的一个变量。查询中的最后一行是对南黄道极点附近物体的修正。(注:eclat=黄道纬度,eclong=黄道经度,两者均以度为单位)作为我想要得到的结果的一个示例,我想要过滤的天空面片以315.8度的黄道经度为中心,如下所示:

我将整个模拟的南半球保存为csv文件,并将eclong和eclat值作为列上传到sql数据库中。我希望能够重新创建我在上面的Python代码中执行的相同查询。这是我最近的一次尝试:

select * from coords
    where eclat < -6
    and mod(abs(eclong-315.8+360),360)-360 < 180
    and mod(abs(eclong-315.8),360) < 12/cos(radians(eclat));
从坐标中选择*
其中eclat<-6
和模块(abs(eclong-315.8+360),360-360<180
和mod(abs(eclong-315.8),360)<12/cos(弧度(eclat));
这将生成以下结果,其中过滤后的Python结果显示为红色,过滤后的sql结果显示为蓝色:

如图所示,我的查询不包括从360度到0度的东西,我也不太确定如何包括那些缺失的点

我认为结合使用THEN、ELSE或CASE语句会有所帮助:

select * from Catalog
where eclat < -6
CASE
    WHEN mod(abs(eclong-315.8),360) < 12/cos(radians(eclat)) > 0 THEN 'I'm not sure what to do...'
    WHEN mod(abs(eclong-315.8),360) < 12/cos(radians(eclat)) < 360 THEN 'I'm not sure what to do...'
into myDB.filename
从目录中选择*
其中eclat<-6
案例
当mod(abs(eclong-315.8),360)<12/cos(radians(eclat))>0时,则“我不确定该怎么办…”
当mod(abs(eclong-315.8),360)<12/cos(radians(eclat))<360时,“我不知道该怎么办……”
输入myDB.filename

有SQL专家吗?

虽然我不熟悉黄道坐标,但听起来你似乎在试图根据你的头衔来调和负数的缺失。如果这真的是你想要的,谁在乎没有任何负面价值呢,让我们假装有吧

总而言之,我们需要确保能够安全地计算出从任何起始经度开始的±180度。在这个用例中,从11度开始,我们可以通过从任何大于
11+180
的值中减去360并将结果作为辅助对象来重新排列没有帮助的值。这样,359度将显示为-1,然后你可以做普通的数学。如果您的起始经度高于180,我们需要获得360以上的最低值。在SQL中,有一种(可能效率不高,但很简单)创建帮助器列的方法:

CASE
    WHEN center < 180 THEN CASE
                               WHEN eclong > center + 180 THEN eclong - 360
                               ELSE eclong
                           END
    WHEN center > 180 THEN CASE
                               WHEN eclong < center - 180 THEN eclong + 360
                               ELSE eclong
                           END
    ELSE eclong
END as friendly_eclong
案例
当中心<180时,则为情况
当eclong>中心+180时,则eclong-360
艾尔斯柯龙
终止
当中心>180时,则为案例
当eclong<中心-180时,则eclong+360
艾尔斯柯龙
终止
艾尔斯柯龙
以友好的方式结束

示例数据和期望的结果将非常有用。感谢您的建议,我添加了一些视觉效果以帮助清晰和概括。感谢您的建议,它帮助我思考如何更好地可视化和测试我的原始问题。关于你建议的方法,我有几个问题。这个“中心”术语是指我定义的某个区域,还是在这种情况下,当使用else end命令时,它作为一个变量?如果它是一个任意数而不是一个变量,我会遇到这些命令的语法错误。我不太精通sql(每天学习更多!),也不知道如何调试这些case语句。据我所知,这似乎是对的。