【问题标题】:Super complicated SQL statement...maybe impossible超复杂的SQL语句……也许不可能
【发布时间】:2017-12-08 08:15:22
【问题描述】:

我做过一些编程和一些 SQL,但除了我自己的小项目外,我不是开发人员。 我现在有一个问题,我很想用纯 SQL 解决,但不知道如何解决。 我有 2 个简单的表格,我需要从中绘制月度报告,但我需要做一些计数,这是棘手的部分。 这是结构...

table 
  km_locations
columns
  location_id INT
  location_name TXT

table
  km_trips
colums
  trip_id INT
  trip_date DATE
  start_location_id INT
  end_location_id INT
  km_start INT
  km_end INT

这里有一些规则让我无法弄清楚......

  1. 在特定日期范围内创建报告,例如。之间 2016 年 2 月 15 日和 2016 年 3 月 15 日。
  2. 将 start_location_id 和 end_location_id 替换为对应的 km_locations 中的 location_name。
  3. 计算我在过去 12 个月内进行了多少次类似的旅行,并 在单独的列中显示增量值。
  4. 也只计算行程或从本国出发的行程,并且仅在当日没有其他具有相同起点和终点目的地组合的行程时才计算。

我可以用这个语句得到下面没有total_trips的示例。

SELECT
t.trip_date,
c1.location_name AS 'trip_start',
c2.location_name AS 'trip_end',
t.km_start,
t.km_end
FROM km_trips t
LEFT JOIN km_locations c1 ON c1.location_id = t.start_location_id
LEFT JOIN km_locations c2 ON c2.location_id = t.end_location_id
WHERE t.trip_date BETWEEN '2016-02-06' AND '2016-03-10'
ORDER BY t.trip_date ASC, t.km_start ASC 

想要的样本日期输出

id     date     trip_start      trip_end        km_start    km_end  total_trips
1   2016-02-15  Home            Grocery Store   10675       10681   8
2   2016-02-15  Grocery Store   Gas Station     10681       10684
3   2016-02-15  Gas Station     Home            10684       10689   5
4   2016-02-16  Home            Grocery Store   10689       10695   9
5   2016-02-16  Grocery Store   Home            10695       10701
6   2016-02-17  Home            School          10701       10723   12
7   2016-02-17  School          Grocery Store   10723       10739
8   2016-02-17  Grocery Store   Friends House   10739       10755
9   2016-02-17  Friends House   Home            10755       10767   7
10  2016-02-18  Home            Friends House   10767       10783   8
11  2016-02-18  Friends House   Home            10755       10767
12  2016-02-19  Home            Friends House   10767       10783   9
13  2016-02-19  Friends House   Grocery Store   10783       10792
14  2016-02-19  Grocery Store   Home            10792       10798   10

对于 SQL 语句来说可能太多了,但我认为视图、联合和一些疯狂的技能可能是可能的。 这是我从 Excel 转移的一个新项目,因此我愿意接受任何可以使这项工作的表结构的建议。 现在我正在尝试使用 SQLite 进行这项工作,但如果这是我唯一的选择,我将使用另一个数据库。

谢谢。

【问题讨论】:

  • 开始值和结束值仅对每次行程有意义。总数与每次旅行有什么关系?
  • 总数应该是在过去 12 个月内我以家为起点或终点的旅行次数。出现了一些格式错误,因此细节在规则号中“隐藏”。 4.
  • 如果你能用 SQL 表达这意味着什么,你就离解决这个问题更近了一步。您可能需要制作一个衍生表,其中包含您可以JOIN in. 的行程计数。
  • Mysql 和 sqlite 是非常不同的系统。删除不相关的标签
  • 简而言之,这就是我的问题,我可以创建语句来获取数据而无需增加行程计数器,但不知道何时开始获取 total_trips 数据。

标签: mysql sql sqlite


【解决方案1】:

尝试相关子查询类型

SELECT
t.trip_date,
c1.location_name AS 'trip_start',
c2.location_name AS 'trip_end',
t.km_start,
t.km_end,
(SELECT count(DISTINCT t2.trip_date) cnt
 FROM km_trips t2
 WHERE t2.trip_date < t.trip_date
    AND  t2.start_location_id = t.start_location_id
    AND  t2.end_location_id = t.end_location_id
    AND (SELECT location_id FROM km_locations WHERE location_name = 'home') 
         IN (t2.start_location_id, t2.end_location_id)
 ) count
FROM km_trips t
LEFT JOIN km_locations c1 ON c1.location_id = t.start_location_id
LEFT JOIN km_locations c2 ON c2.location_id = t.end_location_id
WHERE t.trip_date BETWEEN '2016-02-06' AND '2016-03-10'
ORDER BY t.trip_date ASC, t.km_start ASC 

【讨论】:

  • 非常感谢,会做的。
  • 谢谢 Serg,这非常快,并且更接近于我能够得到的解决方案。我测试过,有2个问题。
  • 谢谢 Serg,这非常快,并且更接近于我能够得到的解决方案。我已经测试过,有2个问题。首先计数从零开始,所以它基本上从第二个开始结束组合开始计数。尝试仅添加一个,但无法将其添加到不包括家庭的人中,这是一个我可以解决的小问题。更大的问题是类似的开始结束组合应该算作一个,例如。 home->Grocery 和 Grocery->Home 应该计入相同的总数。另一个大问题是,例如。杂货每天只能计入一次总数。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多