小编Vla*_*nov的帖子

优化具有时区转换并按小时分组的Mysql查询

这是我的MySql 5.5中的表,具有3000万条记录

CREATE TABLE `campaign_logs` (
  `domain` varchar(50) DEFAULT NULL,
  `campaign_id` varchar(50) DEFAULT NULL,
  `subscriber_id` varchar(50) DEFAULT NULL,
  `message` varchar(21000) DEFAULT NULL,
  `log_time` datetime DEFAULT NULL,
  `log_type` varchar(50) DEFAULT NULL,
  `level` varchar(50) DEFAULT NULL,
  `campaign_name` varchar(500) DEFAULT NULL,
  KEY `subscriber_id_index` (`subscriber_id`),
  KEY `log_type_index` (`log_type`),
  KEY `log_time_index` (`log_time`),
  KEY `campid_domain_logtype_logtime_subid_index` (`campaign_id`,`domain`,`log_type`,`log_time`,`subscriber_id`),
  KEY `domain_logtype_logtime_index` (`domain`,`log_type`,`log_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
Run Code Online (Sandbox Code Playgroud)

在以下查询中,我正在按时区分组

查询

SELECT 
    log_type
    ,DATE_FORMAT(CONVERT_TZ(log_time,'+00:00','+05:30'),'%l %p') AS log_date
    ,count(*) AS total
    ,count(DISTINCT subscriber_id) d 
FROM
    stats.campaign_logs USE INDEX(campid_domain_logtype_logtime_subid_index)
WHERE
    DOMAIN='xxx' 
    AND campaign_id='123' …
Run Code Online (Sandbox Code Playgroud)

mysql sql

5
推荐指数
1
解决办法
359
查看次数

在MySQL InnoDB中存储大于max_allowed_pa​​cket的BLOB的最佳方法

也许这个问题应该在https://dba.stackexchange.com/上询问,我不确定.请在评论中提出建议或将其移至那里.

对于这个项目,我使用的是在Amazon RDS上托管的MySQL 5.6.19.

摘要

我要将数据库中的照片存储BLOBInnoDB表格的列中,我想知道最佳方法.我正在寻找可以比较不同变体的官方文档或某些方法.

在搜索这个主题时,有很多讨论和问题是关于将二进制文件存储在数据库中BLOB还是文件系统中是否更好,数据库只包含文件路径和名称.这种讨论超出了这个问题的范围.对于这个项目,我需要一致性和参照完整性,因此文件将被存储BLOB,问题是如何准确地执行它.

数据库架构

这是架构的相关部分(到目前为止).有一个表格Contracts,其中包含有关每个合同和主ID键的一般信息.对于每份合约,可以拍摄几张(~10张)照片,所以我有一张桌子ContractPhotos:

CREATE TABLE `ContractPhotos` (
  `ID` int(11) NOT NULL,
  `ContractID` int(11) NOT NULL,
  `PhotoDateTime` datetime NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `IX_ContractID` (`ContractID`),
  CONSTRAINT `FK_ContractPhotos_Contracts` FOREIGN KEY (`ContractID`) REFERENCES `Contracts` (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

对于每张照片,我会存储原始的全分辨率图像和少量缩小版本,所以我有一张表ContractPhotoVersions:

CREATE TABLE `ContractPhotoVersions` (
  `ID` int(11) NOT NULL,
  `ContractPhotoID` int(11) NOT NULL,
  `PhotoVersionTypeID` int(11) NOT NULL,
  `PhotoWidth` int(11) …
Run Code Online (Sandbox Code Playgroud)

mysql innodb blob

5
推荐指数
1
解决办法
3019
查看次数

查找开始日期早于前一个结束日期的所有行

有没有办法根据用户撤回所有具有重叠日期时间的记录?

例如;

TableA具有以下行;

TrainerID            StartTime            EndTime
1234                 10-1-2015 08:30      10-1-2015 09:00 
1234                 10-1-2015 08:45      10-1-2015 09:15
1234                 10-1-2015 09:30      10-1-2015 10:00
2345                 10-1-2015 08:45      10-1-2015 09:15
2345                 10-1-2015 09:30      10-1-2015 10:00
Run Code Online (Sandbox Code Playgroud)

我需要一个只能提取以下记录的查询,因为它的开始时间是在培训师的上一个结束时间之前(双重预订):

1234                 10-1-2015 08:45      10-1-2015 09:15
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2012

5
推荐指数
1
解决办法
705
查看次数

如何根据DB中的现有条目快速减少数据表

我目前正试图将数据表插入到数据库中.它工作得很好,速度很快.如果数据库中已存在任何行(重复键),则会出现唯一的问题.

为了解决这个问题,我修改了我的程序,以便我首先检查每个新条目是否已存在于数据库中.这是.......慢(在目前的情况下,我没有很多条目,但后来我需要检查的超过200k条目和那几次).因此,我需要让它变得更快(如果可能的话).

数据表的结构如下:

DataTable transactionTable.Columns.Add("DeviceId", typeof(Int32));
transactionTable.Columns.Add("LogDate", typeof(DateTime));
transactionTable.Columns.Add("LogType", typeof(Int32));
transactionTable.Columns.Add("LogText", typeof(String));

transactionTable.PrimaryKey = new DataColumn[3] {
    transactionTable.Columns[0],
    transactionTable.Columns[1],
    transactionTable.Columns[2]
};
Run Code Online (Sandbox Code Playgroud)

到目前为止我所拥有的是以下内容:

DataTable insertTable = transactionTable.Copy();
insertTable.Clear();
using (SqlConnection sqlcon = new SqlConnection(this.GetConnString()))
{
    sqlcon.Open();
    foreach (var entry in transactionTable.AsEnumerable())
    {
        using (SqlCommand sqlCom = sqlCon.CreateCommand())
        {
            sqlCom.Parameters.Clear();
            sqlCom.CommandText = "SELECT 1 FROM myTable WHERE"
                    + " DeviceId = @DeviceId AND LogDate = @LogDate"
                    + " AND LogType = @LogType"
            sqlCom.Parameters.AddWithValue("@DeviceId", entry.Field<Int32>("DeviceId"));
            sqlCom.Parameters.AddWithValue("@LogDate", entry.Field<DateTime>("LogDate"));
            sqlCom.Parameters.AddWithValue("@LogType", entry.Field<Int32>("LogType"));

            using (SqlDataREader myRead = …
Run Code Online (Sandbox Code Playgroud)

c# sql sql-server datatable sql-server-2012

5
推荐指数
1
解决办法
276
查看次数

tsql group by获取具有最大长度的字母数字列值

我有一个sql视图,让我们调用它SampleView,其结果具有以下格式.

Id (INT), NameA (VARVHAR(50)), NameB (VARCHAR(50)), ValueA (INT), ValueB (INT)
Run Code Online (Sandbox Code Playgroud)

视图的结果集包含可能具有相同Id或不相同的行.如果有两个或多个具有相同Id的行,我希望得到类似以下内容的内容

SELECT 
    Id,
    MAX(NameA),
    MAX(NameB),
    MAX(ValueA),
    MAX(ValueB)
FROM SampleView
GROUP BY Id
ORDER BY Id
Run Code Online (Sandbox Code Playgroud)

关于列Id,ValueAValueB没有任何问题.另一方面,MAX用于两者NameANameB事情并不像预期的那样.经过一些谷歌搜索和搜索后,我意识到这MAX不是字母数字列的"预期"行为.说出预期,我的意思是MAX在我的情况下使用,它将返回NameA最大字符数的值,MAX(LEN(NameA)).我在这里要提到的是,没有任何可能为相同长度NameA的相同值设置两个值Id.这可能会使问题更容易解决.

我使用SQL Server 2012和TSQL.

您对我如何处理这个问题有任何建议吗?

非常感谢您提前寻求帮助.

sql sql-server group-by max sql-server-2012

5
推荐指数
1
解决办法
438
查看次数

如何有效地按指定时区的日期分组?

我目前正在运行一个聚合查询,汇总给定日期的销售量(比如)。

select convert(date, datetimesold), sum(amountsold) from tblSold 
group by convert(date, datetimesold)
Run Code Online (Sandbox Code Playgroud)

其中 datetimesold 是日期时间值。

convert(date,...)摆脱了时间价值,所以group by通过整整一天能集团。

这已经不是很有效了,因为它需要对每行的转换进行表扫描 - 更好的方法是添加一个仅包含日期值的“datesold”列,索引,并在每次插入时包含此值。但这会失去该列的精度,这很重要,因为......

datetimesold是 UTC 日期时间。所以我的问题是:假设我想按天分组,但在美国东部时间。在按以下方式在组中进行转换之前,我必须在 datetimesold 中添加一个以小时为单位的偏移量 - group by convert(date, dateadd(hours, -5, datetimesold))- 但即便如此,由于夏令时,这并不总是准确的 - EDT -4 小时,EST -5 小时。

在 SQL 中我是否有任何有效的选择来执行此操作?我可以在这里使用任何时区感知功能吗?

编辑:为了进一步澄清,我在 Azure SQL 数据库上进行操作。

sql t-sql sql-server date azure-sql-database

5
推荐指数
1
解决办法
3786
查看次数

过滤的唯一约束或类似工具

我需要弄清楚一个设计错误的解决方法,现在修复已经太晚了.我基本上希望重复的数据进入一个特定结构的表来避免它:

CREATE TABLE building (
    building_id INT IDENTITY(1, 1) NOT NULL,
    address_id INT NOT NULL,
    company_id INT NOT NULL,
    CONSTRAINT building_pk PRIMARY KEY (building_id),
    CONSTRAINT building_fk1 FOREIGN KEY (address_id) REFERENCES address (address_id),
    CONSTRAINT building_fk2 FOREIGN KEY (company_id) REFERENCES company (company_id)
);
CREATE INDEX building_idx1 ON building (address_id);
CREATE INDEX building_idx2 ON building (company_id);

/* Prevent dupes */
ALTER TABLE building ADD CONSTRAINT building_uk1 UNIQUE (address_id);
Run Code Online (Sandbox Code Playgroud)

(原始本地化名称已更改,以使其更清晰且与问题相关.)

Acme Inc. 的出口建筑物 API将发送共享相同地址的不同建筑物.删除building_uk1会破坏某些假设唯一性的功能,此时我们无法承担重大的重写.

我想评估building_uk1上述公司(company_id=314)的禁用效果,这可能没有依赖于唯一性的功能.我有什么选择放松building_uk1,只有在 …

sql t-sql sql-server sql-server-2008

5
推荐指数
1
解决办法
552
查看次数

从SQL Server触发器调用Freshdesk API

我的客户想在他的Order表(来自Sage)上使用插入触发器来创建使用API​​的Freshdesk票证.

作为我开发的一部分,我构建了一个存储过程,在提供订单号时可以正常工作.但是,将相同的代码移植到触发器中会毫无错误地返回,但是当存储过程中的相同代码工作时,Freshdesk系统中不会出现任何内容.

我希望评论为什么触发器中的API调用可能是一个坏主意,但Freshdesk调用非常快(从存储过程<1秒).

我想知道的是 - 出于某种原因,SQL Server在架构上是否禁止这样做?如果允许,我可以在哪里查找被抛出的错误.

编辑2:好的,这是整个触发器......以前的版本只有OA调用.

ALTER TRIGGER [dbo].[CreateFreshdeskTicketFromOrder] 
   ON  [dbo].[OEORDH] 
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

  -- Get the original order number, and use that in the main lookup query
  DECLARE @ORDNUM VARCHAR(22)
  SELECT @ORDNUM = ORDNUMBER FROM inserted

  -- Variables for fields going to the API
  DECLARE @EMAIL VARCHAR(60), @SHPCONTACT VARCHAR(60), @ORDNUMBER VARCHAR(22)
  DECLARE @LOCATION VARCHAR(6), @EXPDATE INT
  DECLARE …
Run Code Online (Sandbox Code Playgroud)

sql sql-server triggers freshdesk

5
推荐指数
1
解决办法
240
查看次数

如何将列添加到查询而不需要将它们放在组中?

我有一个表来保存进程.

每个流程都由项目组成,每个项目都有其在流程中收集的值.

进程由客户端执行.

以下是带有虚拟数据的示例数据库方案:http://sqlfiddle.com/#!15/36af4

我需要从这些表中提取一些信息:

  • 物品ID
  • 物品生活
  • 每件物品的总生产过程
  • 每个项目每个生命中最古老的流程(时间戳)
  • 每个项目每个生命的最新流程(时间戳)
  • 每个项目每个生命的最大项目值
  • 每个项目每个生命的最小项目值

我还需要找到每个生命中项目的最新和最旧过程的进程ID和客户端ID:

  • 每个项目每个生命中最早进程的进程ID
  • 每个项目每个生命的最新流程的流程ID
  • 每个项目每个生命中最早进程的客户端ID
  • 每个项目每个生命的最新流程的客户端ID

请注意,对于特定生命周期中的特定项目,最旧进程的进程ID与该生命中该项目的最小值的进程ID不匹配.

我需要为每件物品的每一个生命提供所有这些信息.一个项目可以在不同的客户端中有一个进程,因此我不能按客户端进行分组,因为这会使该项目可能重复.流程也是如此,因为项目可以存在于不同的流程中,我也不能按流程分组.

这是我能为自己做的最远的事情:

 SELECT
  PV.ID_ITEM                                                       AS ID_ITEM,
  PV.ITEM_LIFE                                                     AS LIFE,
  COUNT(PV.ID_ITEM)                                                AS TOTAL_ITEM_PROCESS,
  MIN(P.DATE_TIME)                                                AS OLDEST_PROCESS,
  MAX(P.DATE_TIME)                                                AS NEWEST_PROCESS,
  MAX(GREATEST(PV.ITEM_VALUE_1, PV.ITEM_VALUE_2, PV.ITEM_VALUE_3)) AS MAX_ITEM_VALUE,
  MIN(LEAST(PV.ITEM_VALUE_1, PV.ITEM_VALUE_2, PV.ITEM_VALUE_3))    AS MIN_ITEM_VALUE
FROM PROCESS P
  JOIN PROCESS_VALUES PV ON P._ID = PV.ID_PROCESS
GROUP BY PV.ID_ITEM, PV.ITEM_LIFE;
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何在这个查询中添加最旧和最新进程的客户端和进程ID,而无需在group by子句中添加这些相同的列.例如,如果我在组中添加客户端ID,则如果在不同客户端中存在进程,则会复制某些项目.

我们不能使用MAX或MIN来获取进程ID,因为返回的ID与收集的时间戳不匹配.并不总是较高的ID具有最新的时间戳.

对于小提琴中提供的数据,这应该是输出:

+---------+-----------+-----------------------------------+----------------------------------+----------------------------------+----------------------------------+----------------------------------+----------------------------------+----------------------------------+---------------------------------+---------------------------------+
| ITEM ID | ITEM LIFE | TOTAL PROCESSES PER ITEM PER …
Run Code Online (Sandbox Code Playgroud)

sql postgresql greatest-n-per-group

5
推荐指数
1
解决办法
214
查看次数

确定连续的日期间隔

我有以下表结构:

id int -- more like a group id, not unique in the table
AddedOn datetime -- when the record was added
Run Code Online (Sandbox Code Playgroud)

具体而言id,每天最多只有一条记录.我必须编写一个查询,返回每个的连续(在日级别)日期间隔id.预期的结果结构是:

id int
StartDate datetime
EndDate datetime
Run Code Online (Sandbox Code Playgroud)

请注意,时间部分AddedOn可用,但在此处并不重要.

为了更清楚,这里有一些输入数据:

with data as 
(
  select * from
  (
    values
    (0, getdate()), --dummy record used to infer column types

    (1, '20150101'),
    (1, '20150102'),
    (1, '20150104'),
    (1, '20150105'),
    (1, '20150106'),

    (2, '20150101'),
    (2, '20150102'),
    (2, '20150103'),
    (2, '20150104'),
    (2, '20150106'),
    (2, '20150107'),

    (3, …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2008

4
推荐指数
1
解决办法
343
查看次数